从简单的来说,

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标识位

保证没有性能损失

发表评论

邮箱地址不会被公开。 必填项已用*标注