从简单的来说,
String是Java中非常基础的类,管理着字符串的逻辑,是一个典型的不可变类.提供了构造和管理字符串的逻辑
所有的属性都是final,也是因为如此,修改,裁剪字符串,都会产生新的String对象
StringBuffer为了解决拼接时产生过多对象提供的一个类,保证了线程安全,但是有额外的性能开销
后继者是StringBuilder,没有线程安全的能力,但提高了性能
1.StringBuffer只是粗暴的加上了Synchronized关键字实现的,非常的直白,适合用于常见的线程安全
2.StringBuffer和StringBuilder都是利用了可修改的char数组,在JDK9之后改为了byte数组
3.内部数组长度的维护取决于要拼接多长的字符串,默认是初始字符串+16
对于字符串的拼接,如果使用StringBuilder,在Java8之前是交由StringBuilder直接操作,JDK9里面,使用利用了InvokeDynamic直接调用了本地机器码
对于字符串的缓存,则是可以利用intern方法.让JVM记性缓存,但是在JAVA6,不推荐使用intern,因为缓存的字符串是缓存在永久代的,不会被收集到的
如果不当,直接OOM
后续版本,在JDK8之后,被替换到了元数据区中,当然,默认缓存大小也是有的从1009,缓存到60013,直接使用下面的参数打印即可
-XX:+PrintStringTableStatistics
-XX:StringTableSize=N
而Intern是一种显示的调用,所以很难在使用的时候保证字符串是可以被重复利用的
后来,在JDK 8u20后,出了新的特性,就是G1 GC下的重排列
-XX:+UseStringDeduplication
上面参数可以手动打开
然后在Java中,字符串的操作会利用JVM的Intrinsic机制,直接运行本地代码,这是机器码
在String中,原本的存储是利用了char数组,后来在JAVA9之后,利用了byte数组来存储,加上一个编码的coder标识位
保证没有性能损失