关于String, StringBuffer, StringBudiler(append源码)

1. String是典型的不可变类,被声明为final class,所有属性也是final的。由于不可变性,拼接裁剪都会产生新的String对象。由于String操作的普遍性,往往优化相关操作会对性能有明显影响。

2. java为什么不推荐用+ 来拼接字符串? 因为Stirng是不可变类,每次拼接都会产生大量无用的中间对象,耗费空间而且效率低下。 新建、回收这些多余的对象会额外花费很多时间。 

3. StringBuffer是为了解决拼接产生太多中间对象提供的一个类。线程安全的,但是也带来了额外的性能开销。用StringBuilder会快,StringBuilder与StringBuffer的区别主要是去掉了线程安全的部分,减小了开销,效率提高了。
 

4.StringBuffer内部是用char[]来存储每次new StringBuffer的时候调用父类构造参数,初始化char为16.

 如果有参构造new StringBuffer(String str),初始化为str.length()+16。如下图一是调用的父类,

图二是有参构造。



5 stringBuffer最常用的append 

 在执行append操作的时候会确保当前申请的数组大小是否足够。 

 其中mininumCapacity就是count+len的长度,这就是StringBuilder和StringBuffer底层数组扩容的过程 
 如果过用+ ,每加一次都会重新new一个数组,把新的char放进去。 用Stirngbuidler 拼接,长度不够会直接扩大长度两倍。 
 这个扩容能有效的减少new char数组的次数,所以效率就会高很多,当然也会少很多无用的对象。 但是在jdk8中,JVM会自动对+号拼接用StringBuilder进行化。 

6.java历史版本中,字符串是使用char数组来存数据的,非常直接,但是java中char的长度是两个bytes大小,拉丁语系语言的字符,根本不需要太宽的char,这样就会造成一定的浪费。
jdk9种引入了Compact Strings设计,存储方式从char数组,改变了一个byte数组加上一个标识编码的所谓coder,并将相关字符串操作类都进行的修改,对相关的Intrinsic之类进行重写,以保证没有性能损失。在通用性能测试中,能非常明显看到紧凑字符串带来的优势,更小的内存占用、更快的操作速度。 


7.关于Stirng 还有个intern()方法,基本没用,可以作为了解。





猜你喜欢

转载自blog.csdn.net/weixin_39494923/article/details/80332109