string,stringBuffer和stringBuilder的区别?

string,stringBuffer和stringBuilder的区别?

1、string是不可变的,string为什么不可以变?

1.保存字符串的数组被final修饰且为私有的,并且string类没有提供/暴露修改这个字符串的方法;

2.string类被final修饰导致其不能被继承,进而避免了子类破坏string不可变;

3.string创建的字符串存储在公共池中,而new创建的字符串对象在堆上;

2、StringBuilder和StringBuffer的区别

StringBuilder与StringBuffer都被继承自abstractStringBuider类,在abstractStringBuider中也是使用字符数组保存字符串,不过没有使用final和private关键字修饰,最关键的是这个abstractStringBuider类还提供了很多修改字符串的方法比如append方法;

2、1线程安全性

string中的对象是不可变的,也可以理解为常量,线程安全。

abstractStringBuilder是stringBuilder与StringBuffer的公共类,定义一些字符串的基本操作,如:append,indexof等公共方法,StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以线程是安全的。StringBuilder是jDK1.5引入,并没有对方法进行加同步锁,非线程安全的。

2.2性能

每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针向新的String对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StringBuilder相比使用StringBuffer仅能获得10%-15%左右的性能提升,但却要多线程不安全的风险。

2.3对于三者使用的总结

扫描二维码关注公众号,回复: 16120091 查看本文章

1.操作少量的数据:适用String

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

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

补充:StringJoiner是Java8新出的一个类,用于构造由分隔符分隔的字符序列,并可选择性地从提供的前缀开始和以提供的后缀结尾,它的底层是通过StringBuilder实现的,这样开发人员可以不需要通过StringBuffer或者StingBuilder拼接。

猜你喜欢

转载自blog.csdn.net/weixin_56602545/article/details/130100429