String
String
类是不可变的,也就是说,一旦创建了一个 String
对象,它的值就不能改变。任何对 String
的修改都会创建一个新的 String
对象,而不会改变原来的对象。String
是不可变的,它是线程安全的,可以在多个线程之间安全地共享。String
的不可变性,每次修改字符串时都会创建新的对象,这在频繁修改字符串的场景下会导致性能问题,增加内存开销。示例:
String str1 = "Hello";
String str2 = str1 + " World"; // 生成新的 String 对象
System.out.println(str1); // 输出: Hello
System.out.println(str2); // 输出: Hello World
StringBuffer
StringBuffer
是可变的,可以直接修改对象的内容,而不会创建新的对象。它提供了用于修改字符串内容的方法,如 append
、insert
、delete
等。StringBuffer
是线程安全的,所有方法都是同步的,这意味着它可以在多线程环境中安全使用。StringBuffer
的操作速度比 StringBuilder
慢一些。示例:
StringBuffer stringBuffer = new StringBuffer("Hello");
stringBuffer.append(" World"); // 直接修改原来的对象
System.out.println(stringBuffer); // 输出: Hello World
StringBuilder
StringBuilder
和 StringBuffer
一样,是可变的。你可以通过 append
、insert
等方法来修改字符串内容。StringBuilder
不是线程安全的,因为它的所有方法都没有同步。这使得 StringBuilder
的操作速度比 StringBuffer
快,适用于单线程环境下的字符串操作。StringBuilder
通常比 StringBuffer
更快。示例:
StringBuilder stringBuilder = new StringBuilder("Hello");
stringBuilder.append(" World"); // 直接修改原来的对象
System.out.println(stringBuilder); // 输出: Hello World
String
:适用于字符串不会发生修改的场景,例如字符串常量、少量字符串拼接等。StringBuffer
:适用于多线程环境中频繁修改字符串的场景。StringBuilder
:适用于单线程环境中频繁修改字符串的场景。String
是不可变的,适合在不需要修改字符串的情况下使用,且线程安全。StringBuffer
是可变的且线程安全,适合在多线程环境中使用,但性能较 StringBuilder
稍慢。StringBuilder
是可变的且非线程安全,适合在单线程环境下使用,性能优于 StringBuffer
。