一、基本概念
String
类在 java.lang
包中,是一种不可变的对象,这意味着一旦创建了 String
对象,其值就不能被改变。所有对 String
的修改都会创建一个新的 String
对象。
创建字符串
创建 String
对象的常见方式有以下几种:
String str1 = "Hello, World!"; // 使用字面值
String str2 = new String("Hello, World!"); // 使用构造方法
char[] charArray = {'H', 'e', 'l', 'l', 'o'};
String str3 = new String(charArray); // 通过字符数组
二、常用方法
1. 获取字符串长度
可以使用 length()
方法获取字符串的长度:
String str = "Hello, World!";
int length = str.length(); // length == 13
2. 字符串比较
Java 提供了多种方法来比较字符串:
equals()
:比较字符串的内容是否相同equalsIgnoreCase()
:忽略大小写比较字符串的内容compareTo()
:按字典顺序比较字符串
String str1 = "Hello";
String str2 = "hello";
boolean isEqual = str1.equals(str2); // false
boolean isEqualIgnoreCase = str1.equalsIgnoreCase(str2); // true
int comparison = str1.compareTo(str2); // 返回一个负数,因为 "H" 小于 "h"
3. 字符串连接
可以使用 +
操作符或 concat()
方法来连接字符串:
String str1 = "Hello";
String str2 = "World";
String str3 = str1 + ", " + str2 + "!"; // "Hello, World!"
String str4 = str1.concat(", ").concat(str2).concat("!"); // "Hello, World!"
4. 字符串分割
split()
方法用于分割字符串,并返回一个字符串数组:
String str = "Hello,World,Java";
String[] parts = str.split(","); // parts == ["Hello", "World", "Java"]
5. 子字符串
可以使用 substring()
方法提取子字符串:
String str = "Hello, World!";
String subStr1 = str.substring(7); // "World!"
String subStr2 = str.substring(7, 12); // "World"
6. 查找字符或子字符串
可以使用 indexOf()
和 lastIndexOf()
方法查找字符或子字符串的位置:
String str = "Hello, World!";
int index1 = str.indexOf('o'); // 4
int index2 = str.indexOf("World"); // 7
int lastIndex = str.lastIndexOf('o'); // 8
三、String 的高级用法
1. 格式化字符串
String.format()
方法用于创建格式化字符串:
String name = "John";
int age = 30;
String formattedStr = String.format("Name: %s, Age: %d", name, age); // "Name: John, Age: 30"
2. 字符串的不可变性
由于 String
是不可变的,每次修改字符串时,都会创建一个新的字符串对象。例如:
String str1 = "Hello";
String str2 = str1.concat(" World"); // 创建了一个新的字符串对象
3. 使用 StringBuilder 和 StringBuffer
如果需要频繁修改字符串,建议使用 StringBuilder
或 StringBuffer
,它们是可变的:
StringBuilder sb = new StringBuilder("Hello");
sb.append(", World!"); // "Hello, World!"
StringBuffer sbf = new StringBuffer("Hello");
sbf.append(", World!"); // "Hello, World!"
StringBuilder 和 StringBuffer
在 Java 中,如果需要对字符串进行频繁的修改,推荐使用 StringBuilder
或 StringBuffer
类。它们是可变的字符串类,提供了丰富的操作方法,可以在不创建新对象的情况下修改字符串内容。这对于性能优化非常有帮助。
一、StringBuilder
StringBuilder
是一个用于创建可变字符串的类。它适用于单线程环境,因为它的所有方法都不是线程安全的。
创建 StringBuilder 对象
StringBuilder sb1 = new StringBuilder(); // 默认初始容量为 16
StringBuilder sb2 = new StringBuilder(50); // 指定初始容量
StringBuilder sb3 = new StringBuilder("Hello"); // 通过字符串初始化
常用方法
- append():追加字符串
StringBuilder sb = new StringBuilder("Hello"); sb.append(", ").append("World!"); // "Hello, World!"
-
insert():插入字符串
StringBuilder sb = new StringBuilder("Hello"); sb.insert(5, ", World"); // "Hello, World"
-
delete() 和 deleteCharAt():删除字符串
StringBuilder sb = new StringBuilder("Hello, World!"); sb.delete(5, 7); // "HelloWorld!" sb.deleteCharAt(5); // "Helloorld!"
-
replace():替换字符串
StringBuilder sb = new StringBuilder("Hello, World!"); sb.replace(7, 12, "Java"); // "Hello, Java!"
-
reverse():反转字符串
StringBuilder sb = new StringBuilder("Hello"); sb.reverse(); // "olleH"
StringBuffer
类的方法与 StringBuilder
类的方法几乎相同。
三、String、StringBuilder 和 StringBuffer 的比较
-
不可变性:
String
是不可变的,每次修改都会创建一个新的对象。StringBuilder
和StringBuffer
是可变的,可以在原对象上进行修改。
-
线程安全:
String
和StringBuilder
不是线程安全的。StringBuffer
是线程安全的,适用于多线程环境。
-
性能:
- 在单线程环境中,
StringBuilder
的性能优于StringBuffer
。 - 在多线程环境中,
StringBuffer
能确保安全,但性能略低于StringBuilder
。
- 在单线程环境中,
四、总结
String
、StringBuilder
和 StringBuffer
是 Java 中处理字符串的三种主要方式。了解它们的特点和适用场景,对于编写高效、健壮的代码非常重要。在需要频繁修改字符串时,优先考虑使用 StringBuilder
或 StringBuffer
;在多线程环境中,则选择 StringBuffer
。