String 和 StringBuffer、StringBuilder 的区别是什么?String 为什么是不可变的?

1. 可变性

String类:

字符串是常量,它们的值在创建后不能更改;字符串的底层是一个被 final 修饰的数组,不能改变,是一个常量:

private final byte[] value;

StringBuilder类:

字符串缓冲区,可以提高字符串的操作效率【看成一个长度可以变化的字符串】,底层也是一个数组,但没有被 final 修饰,可以改变长度:byte[] value = new byte[16];

StringBuffer类:

StringBuffer 与 StringBuilder 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 类中也是使用数组保存字符串,但是没有用 final 关键字修饰,所以这两种对象都是可变的。

2. 线程安全性

String 中的对象是不可变的,可以理解为常量,线程安全;

StringBuffer 与 StringBuilder 原理和基本操作相同,区别在于 StringBuffer 支持并发操作,对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的,适合多线程中使用;

StringBuilder 不支持并发操作,没有对方法加同步锁,所以是非线程安全的,适合单线程中使用。

3. 性能

A.  字符串进行相加,内存中会有多个字符串,占用空间多,效率低下;每次对 String 对象进行修改的时候,都会产生新的对象。

String s = "a" + "b" + "c" = "abc";  【"a", "b", "c", "ab" , "abc" 共5个字符串】。

B.  StringBuilder 在内存中始终是一个数组,占用空间少,效率高,初始容量为 16 ,如果超出了 StringBuilder 的容量,会自动扩容。

"a" + "b" + "c" = "abc"

C.  StringBuffer 每次都会对 StringBuffer 对象本身进行操作,不产生新的对象,相较于 StringBuilder 效率低。

猜你喜欢

转载自www.cnblogs.com/lf6688/p/12461522.html