當(dāng)中的String.intern()方法可以用來處理在Java中字符串的重復(fù)問題。通過使用intern()方法,可以節(jié)省大量由重復(fù)字符串對象消耗的堆內(nèi)存。如果一個字符串對象包含與另一個字符串相同的內(nèi)容,但是占用了不同的內(nèi)存位置,例如str1!= str2但str1.equals(str2)true,則稱其為重復(fù)。由于String對象在普通Java應(yīng)用程序中消耗大量堆內(nèi)存,因此使用intern()方法減少重復(fù),也可以使用intern()方法實例化String對象并將它們存儲到String pool中以便進(jìn)一步重用。
例如,當(dāng)你創(chuàng)建一個 String literal像 “ABC” ,然后 它會自動保存在字符串池,但是當(dāng)你再創(chuàng)建一個新的String對象,如新的String(“ABC”) ,即使是相同的字符串,在一個新的對象創(chuàng)建了不同的內(nèi)存位置。這是一個重復(fù)的字符串。
通過在此對象上調(diào)用intern()方法,可以指示JVM將此放入String pool中,并且每當(dāng)其他人創(chuàng)建“abc”時,將返回此對象而不是創(chuàng)建新對象。
通過這種方式,可以在Java中節(jié)省大量內(nèi)存。
關(guān)于String.intern()方法的一些重要問題:
以下是java.lang.String類中有關(guān)intern()方法的一些重要觀點,值得記?。?/p>
1)String.intern()方法位于JDK 1.1的String類中。它返回String對象的規(guī)范表示。當(dāng)調(diào)用intern方法時,如果String pool已包含該String對象,使得equals()返回true,則它將從池返回String對象,否則它將該對象添加到唯一的String pool中。
2)在s1和s2上調(diào)用intern()方法后,s1.intern()== s2.intern(),如果是s1.equals(s2),兩者都將在池中指向相同的String常量。
3)在Java 6之前,String.intern()方法的失控使用可能會導(dǎo)致java.lang.OutOfMemory: PermGen space,因為String pool實際上位于Java堆的PermGen區(qū)域,這在許多JVM(32M到96M)中非常小并且已修復(fù)。
從Java 7開始,intern()方法變得更加有用,因為String pool被重新定位到JVM的主堆空間。
這將有助于通過使用String.intern()方法進(jìn)一步減少String重復(fù)。
在下圖中,可以看到s3和s4在String pool中引用相同的String對象“java”,因為它們是實例化的字符串,而s1和s2指的是單獨的對象,因為它們沒有實現(xiàn)或不使用String literal。
4)另一件要知道的是intern()方法是一個非靜態(tài)方法,應(yīng)該使用Java中的String literal或String object調(diào)用。
這就是在Java中何時使用String.intern()方法。
整套架構(gòu)面試題及系統(tǒng)化的架構(gòu)師資料,熱愛技術(shù),喜歡程序員這一職業(yè),有理想成為一名架構(gòu)師,想面試跳槽漲薪,想提升自己的技術(shù)水平歡迎加入Java進(jìn)階架構(gòu)交流:加入142019080。