8_String 和 StringBuffer,StringBuilder 的区别是什么?

  • Post author:
  • Post category:其他




可变性

简单的来说:

String 类中使用 final 关键字字符数组保存字符串, private final char value[] ,

所以 String 对象是

不可变

的。

而 StringBuilder 与StringBuffer 都继承自 AbstractStringBuilder 类,

在 AbstractStringBuilder 中也是使用字符数组保存字符串 char[]value

但是没有用 final 关键字修饰, 所以这两种对象都是

可变

的。



线程安全性


String

中的对象是不可变的,也就可以理解为常量,

线程安全



AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,

定义了一些字符串的基本操作,如 expandCapacity.append.insert.indexOf 等公共 方法。


StringBuilder

并没有对方法进行加同步锁,所以是

非线程安全

的。


StringBuffer



方法加了同步锁

或者对调用的方法加了同步锁,所以是

线程安全

的。



性能

每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,

然后将指针指向新的 String 对象。

StringBuffer 每次都会对 StringBuffer 对象本身进行操作,

而不是生成新的对象并改变对象引用。

相同情况下使用

StirngBuilder

相比使用

StringBuffer


仅能获得 10%~15% 左右的性能

提升



但却要冒多线程不安全的风险。



对于三者使用的总结:

String StringBuilder StringBuffer
操作少量的数据 单线程操作字符串缓冲区下操作大量数据 多线程操作字符串缓冲区下操作大量数据
线程不安全 线程安全
字符串数值不可变 字符串可修改,可以动态构造字符数据 类是可以通过 Append()来修改值

1.操作少量的数据 => 使用 String

2.单线程操作字符串缓冲区下操作大量数据 => 使用 StringBuilder

3.多线程操作字符串缓冲区下操作大量数据 => 使用 StringBuffer

String:字符串数值不可变;

StringBuilder:线程不安全。

StringBuffer:字符串可修改,可以动态构造字符数据。

StringBuffer 类是可以通过 Append()来修改值。线程安全。



版权声明:本文为aofengchuang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。