Java 中的 String
、StringBuffer
和 StringBuilder
是处理字符串的三种常用类,它们在功能和性能上有所不同。以下是它们的详细总结:
1. String
- 不可变性:
String
类表示字符串是不可变的。一旦创建了String
对象,其内容就不能更改。任何对字符串的修改都会创建一个新的String
对象。 - 线程安全:由于
String
是不可变的,所以它是线程安全的。 - 性能:由于不可变性,频繁的字符串操作(例如连接、替换等)会导致大量的临时对象,影响性能。
- 适用场景:适用于字符串内容不需要频繁改变的情况,如读取配置文件、处理固定格式的数据等。
示例:
String str1 = "Hello";
String str2 = "World";
String str3 = str1 + str2; // 新创建了一个字符串对象
2. StringBuffer
- 可变性:
StringBuffer
表示可变的字符序列。它的内容可以通过调用方法进行修改。 - 线程安全:
StringBuffer
是线程安全的,因为它的方法是同步的。因此在多线程环境中,使用StringBuffer
是安全的。 - 性能:由于其线程安全性,
StringBuffer
的性能稍逊于StringBuilder
。 - 适用场景:适用于需要在多线程环境中频繁修改字符串的情况。
示例:
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // 修改了原有的字符串对象
3. StringBuilder
- 可变性:
StringBuilder
也表示可变的字符序列,与StringBuffer
类似。 - 线程安全:
StringBuilder
不是线程安全的,因为它的方法不是同步的。因此在单线程环境中使用较为安全。 - 性能:由于没有同步开销,
StringBuilder
的性能优于StringBuffer
。 - 适用场景:适用于在单线程环境中需要频繁修改字符串的情况。
示例:
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 修改了原有的字符串对象
比较总结
- 不可变性:
String
不可变,而StringBuffer
和StringBuilder
可变。 - 线程安全:
String
和StringBuffer
是线程安全的,而StringBuilder
不是。 - 性能:在单线程环境下,
StringBuilder
性能最好;在多线程环境下,StringBuffer
性能优于String
。
选择指南
- 如果字符串不会被修改,使用
String
。 - 如果字符串会被频繁修改且在多线程环境中使用,使用
StringBuffer
。 - 如果字符串会被频繁修改且在单线程环境中使用,使用
StringBuilder
。