欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于StringTable的知识

程序员文章站 2022-09-29 22:15:14
StringTable的版本调整记录:1.jdk6及以前,放到永久代中.jdk7将字符串常量池放到了java堆中.2.调整原因: 永久代只有在fullGc的时候才触发.回收效率低,放到堆中,能直接进行内存分配.和回收.String的基本特性:1.用final修饰,不可变,2.实现了seriailizable接口,可序列化.3.实现了comparable接口,可以比较大小.4.在jdk8及以前,底层时char[],jdk9以后改成了byte[]. (原因:char数组一个char占用两个字节,...

StringTable的版本调整记录:
1.jdk6及以前,放到永久代中.jdk7将字符串常量池放到了java堆中.
2.调整原因: 永久代只有在fullGc的时候才触发.回收效率低,放到堆中,能直接进行内存分配.和回收.

String的基本特性:
1.用final修饰,不可变,
2.实现了seriailizable接口,可序列化.
3.实现了comparable接口,可以比较大小.
4.在jdk8及以前,底层时char[],jdk9以后改成了byte[]. (原因:
char数组一个char占用两个字节,而byte数组一个byte占用一个字节,如果是8位的单字节,就会浪费一个字节的空间.StringBuilder和Stringbuffer同样做了调整.)

String的不可变性:
新建一个字符串的时候,会在常量池中,新建一个字符串,不会对原来的字符串进行任何修改.String的常量池底层是个HashTabl,jdk8及以后默认长度是60013,可以通过参数-XX:StringTableSize修改HashTable的默认长度.最低是1009

String的拼接操作:
①常量 + 常量 结果放到了常量池中(编译器的优化).即:“a” + “b” == “ab”
②常量 + 变量 结果在常量池以外的堆中(底层调用了Stringbuilder,新建了一数组对象.) ,只要存在变量相加,==一定是错误的.就会新建对象.
③如果用final修饰了变量或者调用了inner]方法,==就会变为true.

对比用+号拼接字符串和StringBuilder.append操作对比:
使用+底层使用的也是StringBuilder.append,但是会多一步.toString操作.会创建一个String对象,当新建字符串较多时又会出发GC,会更耗时.所以尽量使用StringBuilder拼接字符串.在新建StringBuiler时会建一个长度为16的char数组,不够时需要扩容数组,所以新建StringBuiler时最好指定大概的长度.

对于String的intern方法:
调用此方法:在jdk6及以前会将调用次方的引用对应的字符串在常量池中创建一份. 在jdk7及以后,做了改变,调用此方法的时候,如果在常量池以外的堆中存在改字符串的引用,会把对象的引用地址复制一份放到串池中,并返回地址.多使用intern()方法对于有大量字符串存方法,会明显降低内存的大小

面试题:关于 new String(“111”); 回创建几个对象: 2个,一个在伊甸园区,一个在字符串常量池中.
new String(“a”)+new String(“b”)呢? new 2 + 常量池 2 + new StringBuiler1个 + StringBuilder的拼接操作调用同toString 的 new String 1个 . 所以一共创建了6个

本文地址:https://blog.csdn.net/qq_44741774/article/details/110470190

相关标签: java jvm