这个问题无论是面试还是日常知识点最普通和最基础的知识点,但往往细节才是我们需要注重掌握的。可以这么说,如果不是经历面试,我可能很久都不会特意去了解这三者的联系,做个自我总结反思一下,其实我们面试考察的知识点又何尝不是我们编码过程中常会遇到的各种问题么,切不可抱着面试的心态看待这些问题。在工作学习的过程中,不能对问题有所逃避。
以下内容出自于官方 API Documents 或 SF。
StringBuilder
- StringBuilder 出自 JDK5
- StringBuilder 兼容 StringBuffer ,拥有 StringBuffer 所有操作方法
- 在单线程场景下用于替代 StringBuffer
- 应该优先使用 StringBuilder ,因为大部分实现来说它比 StringBuffer 更快
- StringBuilder 主要的操作方法是
append()
和insert()
方法 - StringBuilder 的
append()
方法总是将数据添加到末端,插入操作可将数据添加到指定的位置 - StringBuilder 的同一个对象在进行不同操作时,都是同一个实例
- 每个 StringBuilder 都有一个容器,可以为其定长,只要字符串长度都不超过限制,它就不会分配新的内部缓冲区。如果超长溢出了,会自动生成一个更长的缓冲区
- StringBuilder 的实例在多线程环境中是非线程安全的。如果需要使用的话,需要加上同步锁
- 值得注意的是,给 StringBuilder 传递一个 null 参数会导致 NullPointerException 异常
StringBuffer
- 线程安全
- 其余特点和 StringBuilder 所述基本一致
源码实现中,StringBuffer 线程安全的原因之一是加了 synchronized 同步锁,但是两者都各自继承了抽象的AbstractStringBuilder 或 AbstractBuffer
String
- String 是一个常量,只在创建后就无法改变,StringBuffer 支持可改变的字符串,因为 String 对象是不可变的,可以被共享
- 在使用
String a = b + c + d;
时,由于性能原因,Java 编译器默认会将其转换为String a = new StringBuilder(b).append(c).append(d).toString();
String a = "a" + "b" + "c";
实际已经在创建的时候就定义为String a = "abc";
例1 :
String str = "abc";
// is equivalent to:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
例2 :String的更多用法:
System.out.println("abc");
String cde = "cde";
System.out.println("abc" + cde);
String c = "abc".substring(2,3);
String d = cde.substring(1, 2);