在Java中何時使用String.intern()方法?

當中的String.intern()方法能夠用來處理在Java中字符串的重複問題。經過使用intern()方法,能夠節省大量由重複字符串對象消耗的堆內存。若是一個字符串對象包含與另外一個字符串相同的內容,可是佔用了不一樣的內存位置,例如str1!= str2但str1.equals(str2)true,則稱其爲重複。因爲String對象在普通Java應用程序中消耗大量堆內存,所以使用intern()方法減小重複,也可使用intern()方法實例化String對象並將它們存儲到String pool中以便進一步重用。java

例如,當你建立一個 String literal像 「ABC」 ,而後 它會自動保存在字符串池,可是當你再建立一個新的String對象,如新的String(「ABC」) ,即便是相同的字符串,在一個新的對象建立了不一樣的內存位置。這是一個重複的字符串。程序員

經過在此對象上調用intern()方法,能夠指示JVM將此放入String pool中,而且每當其餘人建立「abc」時,將返回此對象而不是建立新對象。面試

經過這種方式,能夠在Java中節省大量內存。架構

關於String.intern()方法的一些重要問題:

如下是java.lang.String類中有關intern()方法的一些重要觀點,值得記住:spa

1)String.intern()方法位於JDK 1.1的String類中。它返回String對象的規範表示。當調用intern方法時,若是String pool已包含該String對象,使得equals()返回true,則它將從池返回String對象,不然它將該對象添加到惟一的String pool中。cdn

2)在s1和s2上調用intern()方法後,s1.intern()== s2.intern(),若是是s1.equals(s2),二者都將在池中指向相同的String常量。對象

3)在Java 6以前,String.intern()方法的失控使用可能會致使java.lang.OutOfMemory: PermGen space,由於String pool實際上位於Java堆的PermGen區域,這在許多JVM(32M到96M)中很是小而且已修復。blog

從Java 7開始,intern()方法變得更加有用,由於String pool被從新定位到JVM的主堆空間。內存

這將有助於經過使用String.intern()方法進一步減小String重複。字符串

在下圖中,能夠看到s3和s4在String pool中引用相同的String對象「java」,由於它們是實例化的字符串,而s1和s2指的是單獨的對象,由於它們沒有實現或不使用String literal。

在Java中何時使用String.intern()方法?
4)另外一件要知道的是intern()方法是一個非靜態方法,應該使用Java中的String literal或String object調用。

這就是在Java中什麼時候使用String.intern()方法。

整套架構面試題及系統化的架構師資料,熱愛技術,喜歡程序員這一職業,有理想成爲一名架構師,想面試跳槽漲薪,想提高本身的技術水平歡迎加入Java進階架構交流:加入142019080。

直接點擊連接加羣。https://jq.qq.com/?_wv=1027&k=5lXBNZ7

相關文章
相關標籤/搜索