下文筆者講述java中String.intern()方法的功能簡介說明,如下所示:
String.intern原理
String.intern():
此方法是一個Native方法
底層呼叫C++的 StringTable::intern方法實作
當通過陳述句str.intern()呼叫intern()方法后
JVM 就會在當前類的常量池中查找是否存在與str等值的String
若存在則直接回傳常量池中相應Strnig的參考
若不存在,則會在常量池中創建一個等值的String
然后回傳這個String在常量池中的參考
---------------------------------------------------------------
因此,只要是等值的String物件
使用intern()方法回傳的都是常量池中同一個String參考
所以,這些等值的String物件通過intern()后使用==是可以匹配的
JDK6中String.intern()
Jdk6中常量池位于PermGen(永久代)中
PermGen是一塊主要用于存放已加載的類資訊和字串池的大小固定的區域
--------------------------------------------------------------------------
運行intern()方法時
當常量池中不存在等值的字串,JVM就會在常量池中創建一個等值的字串
然后回傳該字串的參考
除此以外,JVM 會自動在常量池中保存一份之前已使用過的字串集合
Jdk6中使用intern()方法的主要問題就在于常量池被保存在PermGen(永久代)中
注意事項:
首先PermGen是一塊大小固定的區域,一般不同的平臺PermGen的默認大小也不相同,
大致在32M到96M之間,
所以不能對不受控制的運行時字串(如用戶輸入資訊等)使用intern()方法,
否則很有可能會引發PermGen記憶體溢位;
其次String物件保存在Java堆區,Java堆區與PermGen是物理隔離的,
因此如果對多個不等值的字串物件執行intern操作,
則會導致記憶體中存在許多重復的字串,會造成性能損失
JDK7中String.intern()
Jdk7將常量池從PermGen區移到了Java堆區
運行intern操作時
當常量池已經存在該字串,則直接回傳字串參考
否則復制該字串物件的參考到常量池中并回傳
堆區的大小一般不受限,所以將常量池從PremGen區移到堆區使得常量池的使用不再受限于固定大小
除此之外,位于堆區的常量池中的物件可以被垃圾回收
當常量池中的字串不再存在指向它的參考時,JVM就會回收該字串
可以使用 -XX:StringTableSize 虛擬機引數設定字串池的map大小
字串池內部實作為一個HashMap
所以當能夠確定程式中需要intern的字串數目時
可以將該map的size設定為所需數目*2(減少hash沖突)
這樣就可以使得String.intern()每次都只需要常量時間和
相當小的記憶體就能夠將一個String存入字串池中
String.intern()方法的功能:
其功能手動將字串放入常量池中
相關閱讀:http://www.java265.com/JavaCourse/202204/2679.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/482951.html
標籤:其他
上一篇:避免死鎖的方法分享
下一篇:如何在C#中旋轉正多邊形
