Java String Java 编程语言中用来表示和操作文本(一串字符)的数据类型。

你可以把它想象成一个字符容器,专门用来存放文字信息,比如你的名字、一句话、一个地址等等。
下面我们从几个方面来深入理解它:
核心概念:String 是什么?
在 Java 中,String 是一个类,而不是像 int、double 那样的基本数据类型,这意味着 String 提供了非常丰富的方法来操作字符串内容。
两个重要特性:
a) 不可变性

这是 String 最核心、最重要的一个特性。
-
定义:一旦一个
String对象被创建,它的内容(即它所包含的字符序列)就不能被改变。 -
如何实现:当你看起来像是在修改一个字符串时(比如调用
replace()或substring()),JVM 实际上会创建一个新的String对象来存放修改后的内容,而原始的String对象保持不变。 -
例子:
(图片来源网络,侵删)String original = "hello"; String modified = original.replace('h', 'j'); // 看似在修改 System.out.println("original: " + original); // 输出: original: hello System.out.println("modified: " + modified); // 输出: modified: jello在这个例子中,
original字符串本身并没有被修改,而是创建了一个新的字符串modified。original仍然指向 "hello"。 -
优点:
- 线程安全不能被改变,所以在多线程环境下,多个线程可以同时访问一个
String对象而不用担心它会被意外修改。 - 安全:在处理文件路径、URL 等敏感信息时,不可变性可以防止内容被篡改。
- 可以被共享和缓存:JVM 会有一个叫做“字符串常量池”的特殊内存区域,当你创建一个字符串字面量(如
String s = "abc";),JVM 会先检查池中是否已经存在 "abc",如果存在就直接引用,不存在则创建并存入池中,这大大节省了内存。
- 线程安全不能被改变,所以在多线程环境下,多个线程可以同时访问一个
b) 字符串字面量
在 Java 代码中,用双引号 括起来的内容就是字符串字面量,Java 会自动为这些字面量创建 String 对象。
String str1 = "Hello World"; // str1 是一个字符串字面量 String str2 = "Java"; // str2 也是一个字符串字面量
如何创建和使用 String?
创建字符串
有几种常见的方式:
-
使用字符串字面量(最常用)
String str = "Hello";
-
使用
new关键字(不推荐,除非有特殊需求) 这种方式会强制在堆内存中创建一个新的对象,即使内容相同,也不会使用字符串常量池中的对象。String str = new String("Hello");
常用操作和方法
String 类提供了大量非常方便的方法,这里列举一些最常用的:
| 方法 | 描述 | 示例 |
|---|---|---|
length() |
返回字符串的长度(字符个数) | "abc".length() 返回 3 |
charAt(int index) |
返回指定索引位置的字符 | "Hello".charAt(1) 返回 'e' |
substring(int beginIndex) |
截取从 beginIndex 开始到结尾的子字符串 |
"Hello".substring(1) 返回 "ello" |
substring(int begin, int end) |
截取从 beginIndex 到 endIndex-1 的子字符串 |
"Hello".substring(1, 3) 返回 "el" |
indexOf(String str) |
查找子字符串第一次出现的位置,找不到返回 -1 | "Hello".indexOf("l") 返回 2 |
contains(CharSequence s) |
判断字符串是否包含指定的字符序列 | "Hello".contains("ell") 返回 true |
toUpperCase() / toLowerCase() |
转换为大写 / 小写 | "aBc".toUpperCase() 返回 "ABC" |
trim() |
去除字符串首尾的空白字符(空格、制表符等) | " abc ".trim() 返回 "abc" |
replace(char old, char new) |
将所有 old 字符替换为 new 字符 |
"hello".replace('l', 'p') 返回 "heppo" |
split(String regex) |
根据给定的正则表达式分割字符串 | "a,b,c".split(",") 返回数组 ["a", "b", "c"] |
| (连接符) | 用于连接两个或多个字符串 | "Hello" + " " + "World" 返回 "Hello World" |
String、StringBuilder 和 StringBuffer 的区别
由于 String 的不可变性,在需要频繁修改字符串内容的场景(比如循环拼接字符串),使用 String 会产生大量中间对象,导致性能问题,这时就需要 StringBuilder 和 StringBuffer。
| 特性 | String |
StringBuilder |
StringBuffer |
|---|---|---|---|
| 可变性 | 不可变 | 可变 | 可变 |
| 线程安全 | 安全 | 不安全 (非线程同步) | 安全 (线程同步) |
| 性能 | 频繁修改时性能差 | 性能最好 | 性能比 StringBuilder 稍差 |
| 使用场景 | 存储不变的文本,如常量、配置信息 | 单线程环境下进行大量字符串操作 | 多线程环境下进行大量字符串操作 |
简单选择建议:
- 如果字符串内容不需要改变,就用
String。 - 如果在单线程中需要频繁修改字符串(如循环拼接),就用
StringBuilder。 - 如果在多线程环境中需要安全地修改字符串,就用
StringBuffer。
Java String 是 Java 语言中处理文本的基础,记住它的两个核心要点:
- 它是一个类,提供了丰富的方法来操作文本。
- 它不可变,一旦创建内容就不能改变,这带来了安全、线程安全和内存优化的好处。
在日常开发中,你会频繁地使用 String 来存储、传递和处理各种文本信息,它是 Java 编程中最基本、最重要的工具之一。
