今天群里討論了一下占小狼的一篇博客http://www.reibang.com/p/c14364f72b7e
代碼如下
public class Test {
public static void main(String[] args) {
String sq1 = new StringBuilder().append("aa").append("bb").toString();
System.out.println(sq1 == sq1.intern());//true
String sq2 = new StringBuilder("aa").append("bb").toString();
System.out.println(sq2 == sq2.intern());//false
String sq3 = new StringBuilder().append("ja").append("va").toString();
System.out.println(sq3 == sq3.intern());//false
}
}
上面三個結(jié)果绑榴,看出了什么萌业。其實看的一臉蒙蔽稚虎。
討論的結(jié)果是在1.8環(huán)境下intern()
常量池的內(nèi)存在永久帶中分配,永久帶和java堆的內(nèi)存是物理隔離的裁眯,執(zhí)行intern()時鹉梨,如果常量池不存在該字符串,虛擬機會在常量池中復(fù)制該字符串穿稳,并返回引用存皂。如果有相同的字符串,則返回第一次創(chuàng)建的引用逢艘。
具體的分析看占小狼的博客旦袋。這個有個JVM參數(shù)
-XX:StringTableSize=____
我們在調(diào)用String.intern()的時候會往hashtable中插入一項,這個table就是StringTable它改,使用最多的是序列號反序列化場景疤孕,為了避免同一個字符串被多次創(chuàng)建。保證每一次通過String.intern()返回同一個字符對象搔课。
如果這個參數(shù)設(shè)置的太小胰柑,帶來的問題就是hash碰撞。這樣就比較消耗cpu爬泥,jdk1.6之后出現(xiàn)了rehash,但是表的size小的話崩瓤,只能換來不斷的rehash袍啡,因此性能比較差,所以一般這個參數(shù)設(shè)置的稍微大點的質(zhì)數(shù)却桶。