String
String 是不可变的,这意味着每次当你对 String 进行修改操作(如拼接)时,都会创建一个新的 String 对象(创建新的对象在意味着在内存空间中消耗一定的内存,在开发大型项目时,需要尽量避免消耗内存空间的操作)。
public class StringExample {
public static void main(String[] args) {
String str = "Hello";
str = str + " World!"; // 这里会创建一个新的String对象
System.out.println(str); // 输出 "Hello World!"
// String的重要方法(非修改方法):
// substring(int beginIndex, int endIndex) - 返回一个新字符串,它是此字符串的一个子字符串
String subStr = str.substring(0, 5); // "Hello"
System.out.println(subStr);
// concat(String str) - 将指定字符串连接到此字符串的结尾
String concatenatedStr = str.concat(" Again!"); // 注意:这将创建新的String对象
System.out.println(concatenatedStr); // 输出 "Hello World! Again!"
}
}
StringBuffer
StringBuffer 是可变的,并且它是线程安全的。它提供了修改字符串内容的方法,而不需要创建新的对象。
public class StringBufferExample {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World!"); // 在原对象上修改,不创建新对象
System.out.println(sb.toString()); // 输出 "Hello World!"
// StringBuffer的重要方法(修改方法):
// append(String str) - 将指定字符串追加到此字符序列
// insert(int offset, String str) - 在此字符序列的指定位置插入指定字符串的子字符串
// delete(int start, int end) - 移除此序列的子字符串中的字符
sb.insert(5, "Beautiful "); // 在索引5的位置插入"Beautiful "
sb.delete(12, 17); // 删除从索引12到16的字符(不包括17)
System.out.println(sb.toString()); // 输出 "HelloBeautiful World"
}
}
StringBuilder
StringBuilder 与 StringBuffer 非常相似,但它是非线程安全的。由于没有同步开销,因此在单线程应用中通常比 StringBuffer 更快。
public class StringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World!"); // 在原对象上修改,不创建新对象
System.out.println(sb.toString()); // 输出 "Hello World!"
// StringBuilder的重要方法与StringBuffer相同,但它是非线程安全的
// append, insert, delete等方法与StringBuffer中的相同
sb.insert(5, "Beautiful ");
sb.delete(12, 17);
System.out.println(sb.toString()); // 输出 "HelloBeautiful World"
}
}
注意:
- 当你在循环中拼接大量字符串时,使用 StringBuilder 或 StringBuffer 而不是 String 会更加高效,因为它们避免了在每次拼接时都创建新的字符串对象。
- 如果你的代码在多线程环境中运行,并且需要修改字符串,那么应该使用 StringBuffer 以确保线程安全。如果你确定你的代码只会在单线程环境中运行,那么使用 StringBuilder 会更加高效。