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!

推薦閱讀: