【StringJoiner 、StringBuilder、StringBuffer 功能解读】
功能对比
| 特性 | StringJoiner | StringBuilder | StringBuffer |
| 设计目的 | 专门用于拼接带分隔符的序列 | 通用的字符串构建器 | 线程安全的字符串构建器 |
| 分隔符处理 | 自动处理,不会在末尾添加多余分隔符 | 需要手动控制,易出错 | 需要手动控制,易出错 |
| 前缀/后缀 | 内置支持 | 需要手动添加 | 需要手动添加 |
| 代码简洁性 | 高 | 低 | 低 |
| 线程安全 | 否 | 否 | 是 |
| 性能 | 较高(基于StringBuilder) | 最高 | 较低(因同步开销) |
StringJoiner
常用于处理分隔符的相关操作
public class StringJoiner用法 {static void main() {// 只有分隔符StringJoiner joiner1 = new StringJoiner(", ");// param: 分隔符, 前缀, 后缀StringJoiner joiner2 = new StringJoiner(",", "[", "]");StringJoiner joiner = new StringJoiner(", ");joiner.add("Apple");joiner.add("Banana");joiner.add("Cherry");System.out.println(joiner .toString()); // 输出: Apple, Banana, CherrySystem.out.println("-----------------------------");// 支持链式调用joiner.add("Orange").add("Grape");StringJoiner joiner3 = new StringJoiner(", ", "[", "]");joiner3.add("A").add("B");StringJoiner joiner4 = new StringJoiner("-", "(", ")");joiner4.add("1").add("2");// 注意:只合并内容,不合并前缀后缀joiner3.merge(joiner4);System.out.println(joiner3.toString()); // 输出: [A, B, 1-2]}
}StringBuilder
循环中的大量字符串操,复杂的条件性字符串构建
1.StringBuilder继承AbstractStringBuilder类
2.实现了Serializable,说明StringBuilder对象是可以串行化(对象可以网络传输,可以保存到文件)
3.StringBuilder 是final类,不能被继承
4.StringBuilder对象的字符序列仍然存放在其父类 AbstractStringBuilder的 char[]value;
因此,字符序列是存放堆中
5.StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的
情况下使用StringBuilder
StringBuilder stringBuilder = new StringBuilder();
pubnlic class T{public static void main(String[] args) {StringBuilder sBuilder= new StringBuilder(" ");startTime=System.currentTimeMillis();getF(sBuilder);endTime=System.currentTimeMillis();System.out.println("StringBuilder执行时间= "+(endTime- startTime));}public static void getF(StringBuilder str){for (int i = 0; i <20000 ; i++) {str.append("i");}}
}
StringBuffer
当线程安全比性能更重要时更适合,多线程环境下的字符串操作
public class T {public static void main(String[] args) {long startTime=0L;long endTime=0L;StringBuffer sBuffer = new StringBuffer(" ");startTime=System.currentTimeMillis();getF(sBuffer);endTime=System.currentTimeMillis();System.out.println("StringBuffer执行时间= "+(endTime- startTime));}public static void getF(StringBuffer str){for (int i = 0; i <20000 ; i++) {str.append("i");}}
}
