天天看点

String类、StringBuffer类、StringBuilder类的区别

String是Java中基础且重要的类,并且String也是Immutable类的典型实现,被声明为final class,除了hash这个属性其它属性都声明为final,因为它的不可变性,所以例如拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。

StringBuffer就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类,提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列,把所有修改数据的方法都加上了synchronized。但是保证了线程安全是需要性能的代价的。

在很多情况下我们的字符串拼接操作不需要线程安全,这时候StringBuilder登场了,StringBuilder是JDK1.5发布的,它和StringBuffer本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。

StringBuffer 和 StringBuilder 二者都继承了 AbstractStringBuilder ,底层都是利用可修改的char数组(JDK 9 以后是 byte数组)。

所以如果我们有大量的字符串拼接,如果能预知大小的话最好在new StringBuffer 或者StringBuilder 的时候设置好capacity,避免多次扩容的开销。扩容要抛弃原有数组,还要进行数组拷贝创建新的数组

String是一个不可变的字符序列,字符串常量

StringBuffer是一个可变的字符序列 ,字符串变量(线程安全)

StringBuilder 是一个可变的字符序列 ,字符串变量(非线程安全)

String对象值的修改都是重新创建一个新的对象,然后把新的值保存进去

StringBuffer类对象,每次返回的都是原对象,可以通过append()方法来修改值

String对象底层重写了hascode和equals

StringBuffer对象底层未重写了hascode和equals

StringBuffer性能比String高

StringBuffer是线程安全的

无参构造方法,Sting为空字符初始容量为0,StringBuffer初始容量为16

StringBuffer和StringBuilder的区别

StringBuffer 线程安全 同步的 速度慢

StringBuilder 线程不安全 非同步的 速度快

  • 1.Character 是进行单个字符操作的,
  • 2.String 对一串字符进行操作,不可变类。
  • 3.StringBuffer 对一串字符操作,可变类
  • 4.StringBuilder 对一串字符操作,可变类
 String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。

    private final char value[];

我的理解:String对象不可变:比如 String aa = new String("hello"); 

//新建一个String对象,指向一个地址,地址上的值是"hello";  

aa = "world";

//新取一段地址空间(不是原来的),值是"world",aa指向这个新的地址

aa += "!";

//新取一段地址空间(不是原来的),值是"world!",aa指向这个新的地址

//所以说String值每修改一次,内存里就会新建一个字符串,String对象指向的地址也会发生改变StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。
char[] value;