1. 三者区别
- 速度 StringBuilder > StringBuffer > String
- StringBuilder 线程是不安全的,StringBuffer、String 线程是安全的
1.1 为什么存在速度快慢
String 为字符串常量,一旦创建控件不可能变更。
而 StringBuilder 和 StringBuffer 均为字符串变量,而不进行创建和回收的操作,所以速度要比String快很多。
1.2 为什么说 StringBuffer 线程是安全的
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法都带有synchronized关键字,所以可以保证线程是安全的,
1.3 为什么说 StringBuilder 线程是不安全的
但 StringBuilder 的append方法中没有synchronized关键字,所以不能保证线程安全。
实际上,StringBuilder 是 StringBuffer 的简化版,在单线程操作中效率更高。
2. 使用说明
2.1 示例
2.1.1 String 示例
字符串自定义
String str="字符串";
2.1.2 StringBuffer 示例
StringBuffer 的创建
/*StringBuffer 的内部实现采用字符数组,默认数组的长度为16,超过数组大小时
* 动态扩充的算法是原来长度*2+2
* 所以当我们与只要添加的数据长度时,建议使用带初始化容量的构造方法,来避免动态扩充的次数
* 从而提高效率
* 是线程安全的,两个线程同时用StringBuffer时,排队
* 所以会影响性能
*/
StringBuffer sBuffer = new StringBuffer("Buffer示例:");
sBuffer.append("AA");
sBuffer.append(".BB");
sBuffer.append(".CC");
System.out.println(sBuffer);
2.1.3 StringBuilder 示例
JDK 5.0 中引入 StringBuilder,前身就是 StringBuffer,不支持多线程,如果是单线程就使用 StringBuilder 如果是多线程就使用 StringBuffer
StringBuilder sb = new StringBuilder("StringBuilder 示例");
sb.append("AA");
sb.append(".BB");
sb.append(".CC");
System.out.println(sb);
2.2 应用场景
- String 应用与较少字符串
- StringBuilder 适用于单线程下在字符缓冲区进行大量操作的情况
- StringBuffer 适用于多线程下的字符缓冲进行大量操作的情况