一、先说结论
String
类一旦创建了一个String
对象,它的值就不能改变,对String
进行操作时,都会创建一个新的String
对象,此外,String
是线程安全的。StringBuffer
对象可变,可以对其内容进行修改而不产生新的对象,StringBuffer
是线程安全的,适用于多线程的环境。StringBuilder
在进行字符串拼接和修改时效率比StringBuffer
更高,因为它的方法不是同步的,所以它也是线程不安全的。
二、String
在 Java 中,String
是一个非常重要的类,用于表示和操作文本数据。它是 java.lang
包的一部分。
- 不可变性:
String
对象是不可变的。一旦创建了一个String
对象,它的值就不能被改变。每次对字符串进行操作(如连接、截取等)时,都会生成一个新的String
对象。 - 线程安全:由于
String
是不可变的,它是线程安全的,可以在多个线程中共享而不需要额外的同步。 - 性能:由于每次操作都会生成新的对象,所以频繁的字符串操作会导致较多的内存开销和性能问题。
String str = "Hello";
str = str + " World"; // 产生了一个新的字符串对象 "Hello World"
主要方法
1. 长度
-
length()
: 返回字符串的长度。
2. 字符访问
charAt(int index)
: 返回指定索引位置的字符。
3. 子字符串
-
substring(int beginIndex)
: 返回从指定索引开始到字符串末尾的子字符串。 -
substring(int beginIndex, int endIndex)
: 返回从beginIndex
到endIndex
之间的子字符串。
4. 字符串连接
concat(String str)
: 将指定字符串连接到当前字符串的末尾。
5. 字符串替换
replace(CharSequence target, CharSequence replacement)
: 替换字符串中所有匹配的字符序列。
6. 去除空格
trim()
: 去除字符串前后的空格。
7. 字符串分割
split(String regex)
: 根据指定的正则表达式将字符串分割成一个字符串数组。split(String regex, int limit)
: 根据指定的正则表达式将字符串分割成一个字符串数组,指定数组的最大长度。
8. 转换大小写
toUpperCase()
: 将字符串转换为大写。toLowerCase()
: 将字符串转换为小写。
9. 比较
equals(Object anObject)
: 比较两个字符串的内容是否相同。equalsIgnoreCase(String anotherString)
: 忽略大小写比较两个字符串。compareTo(String anotherString)
: 按字典顺序比较两个字符串。compareToIgnoreCase(String anotherString)
: 忽略大小写按字典顺序比较两个字符串。
10. 查找
indexOf(int ch)
: 返回指定字符在字符串中第一次出现的位置。indexOf(String str)
: 返回指定子字符串在字符串中第一次出现的位置。lastIndexOf(int ch)
: 返回指定字符在字符串中最后一次出现的位置。lastIndexOf(String str)
: 返回指定子字符串在字符串中最后一次出现的位置。
11. 是否包含
contains(CharSequence sequence)
: 判断字符串是否包含指定的字符序列。
12. 开头和结尾
startsWith(String prefix)
: 判断字符串是否以指定前缀开始。endsWith(String suffix)
: 判断字符串是否以指定后缀结束。
字符串池
- 字符串常量池:Java 使用字符串池来存储字符串常量。当你使用
String
字面量时,Java 会检查字符串池中是否已存在该字符串,如果存在,则复用,否则创建一个新的String
对象并放入池中。
性能考虑
- 不可变性带来的性能:由于
String
对象是不可变的,字符串操作(如连接)可能会涉及创建多个临时String
对象。为了提高性能,可以使用StringBuilder
或StringBuffer
类来处理频繁的字符串修改操作。
三、StringBuilder
在 Java 中,StringBuilder
是一个可变的字符序列类,用于创建和操作字符串。与 String
不同,StringBuilder
允许你修改字符串的内容而无需创建新的对象,这样可以提高性能,特别是在需要频繁修改字符串的情况下。
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 修改了现有对象
主要特点
- 可变性:
StringBuilder
对象可以在创建后修改其内容,不会创建新的对象。 - 性能:对于频繁的字符串操作,如拼接或插入,
StringBuilder
比String
更高效,因为它避免了大量的临时对象创建。 - 线程不安全:
StringBuilder
是线程不安全的,因此在多线程环境中需要额外的同步处理。如果需要线程安全的可变字符串,可以使用StringBuffer
类。
常用方法
1. 构造方法
StringBuilder()
: 创建一个空的StringBuilder
对象。StringBuilder(String str)
: 使用指定的字符串初始化StringBuilder
对象。
2. 字符串拼接
append(boolean b)
: 将布尔值添加到StringBuilder
。append(char c)
: 将字符添加到StringBuilder
。append(String str)
: 将指定的字符串添加到StringBuilder
。
3. 插入
insert(int offset, String str)
: 在指定位置插入指定的字符串。insert(int offset, char c)
: 在指定位置插入字符。
4. 删除
delete(int start, int end)
: 删除从指定起始位置到结束位置的字符。deleteCharAt(int index)
: 删除指定位置的字符。
5. 替换
replace(int start, int end, String str)
: 替换从指定起始位置到结束位置的字符为指定字符串。
6. 反转
reverse()
: 反转StringBuilder
中的字符顺序。
7. 转换为字符串
toString()
: 返回StringBuilder
的字符串表示形式。
四、StringBuffer
StringBuffer
是 Java 中用于创建和操作可变字符序列的类,与 StringBuilder
类似,但有一些重要的区别。StringBuffer
是线程安全的,因此可以在多线程环境中安全地使用。
主要特点
- 可变性:
StringBuffer
对象可以在创建后修改其内容,不会创建新的对象。 - 线程安全:
StringBuffer
提供了同步操作,以确保在多线程环境下对StringBuffer
对象的操作是线程安全的。这是通过同步方法实现的。 - 性能:虽然
StringBuffer
是线程安全的,但由于同步开销,它在单线程环境中的性能通常不如StringBuilder
。
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // 修改了现有对象
常用方法
StringBuilder
的方法与 StringBuffer
几乎相同,但没有线程安全的同步机制