关于StringTable的知识

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个

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值