java中String.intern()方法功能介紹
下文筆者講述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()方法的功能:
其功能手動將字符串放入常量池中
到此這篇關於java中String.intern()方法具有什麼功能呢?的文章就介紹到這瞭,更多相關java String.intern()內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!