String 为什么是不可变的?
- 保存字符串的数组被final修饰且私有,并且String类没有提供/暴露修改这个字符串的方法
- String类本身被final修饰,不能被继承,从而避免了子类的修改。
String 、 StringBuffer 和 StringBuilder 的区别
1.可变性
String类型是不可变的
StringBuffer和StringBuilder均继承了AbstractStringBuilder类,也是用字符数组存储字符串,但没有用final和private关键字修饰,且提供了修改字符串的方法比如append
2.线程安全性
String类型是不可变的,可理解为常量,线程安全的
AbstractStringBuilder类是StringBuffer和StringBuilder的公共父类,定义了一些字符串的公共操作。
StringBuffer对方法加了同步锁,所以是线程安全的
StringBuilder并没有对方法加同步锁,因此是线程不安全的
3.性能
每次对String类型进行改变时,都会生成一个新的String对象,然后指针指向新的String对象。
StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。
相同情况下,使用StringBuilder相比StringBuffer仅能获得10%左右的性能提升,却带来了线程不安全的问题。
总结
- 操作少量的数据,适合String
- 单线程下操作大量数据,使用StringBuilder
- 多线程操作字符串缓冲区下操作大量数据,适用StringBuffer
String s1=new String("abc");这句话创建了几个字符串对象?
会创建1个或2个字符串对象
创建2个字符串对象的情况:
String s1 = new String("abc");
创建1个字符串对象的情况:
String s1 = "abc";
String s2=new String("abc");