2016-04-15 17 views
0
String s1=new String("abcd"); 
s2=s1.intern(); 

據說intern()將在池中創建一個字符串文字,如果它尚不存在。intern()是否曾經在池中創建一個文字?

我的問題是什麼時候會出現這種情況,字符串對象存在但不是字面值?而intern()將不得不實際去創建一個新的文字,然後返回文字的引用。

+0

我們不希望把*每個*字符串放入字符串池中。將字符串存儲在池中是有意義的,只有當您稍後要重用此字符串時纔有意義,例如,它適用於您在代碼中創建的字符串文字,您可能需要它多次,例如for(i ..){System.out.print (「寫你的號碼:」);陣列[I] = readNumber();}'。但是,如果您正在逐行閱讀文件/控制檯/套接字/其他文件之類的文本,則不一定要讓JVM記住所有這些行。您可能只想打印一次,讓GC從內存中移除它們。 – Pshemo

回答

2

例如:

String first = "ab"; 
String second = "cd"; 
String interned = first.concat(second).intern(); 

大多數在程序中串被動態創建的:通過連接值,接收它們通過套接字,從文件或數據庫中讀取它們,或者從控制檯或GUI。

請注意,您的術語是錯誤的。 intern()不會創建一個字符串文字。它向池中添加一個字符串,字符串文字(即字符串中出現字面的字符串,如"abcd")與明確實施的字符串一起存儲在池中。

+0

是否有可能控制哪些字符串進入池中? 我的理解是,每個字符串都應該在游泳池中。 – noobCoder

+2

字符串文字在池中。其他字符串不是,除非你實習。你爲什麼要把所有的琴絃放進水池?假設您逐行讀取1GB文件以提取一些數據並將數據寫入另一個文件。然後,您需要2GB的內存將所有這些行存儲在內存中,因爲沒有任何內容:您將永遠不會重複使用這些行。 –

+0

你不需要2GB的內存;將一個字符串添加到池中並不意味着創建了一個新的實例 - 這是特定於實現的。您可能會收到同一個實例,現在是該池的成員。更重要的是,即使在將字符串添加到池中之後,它們仍然可以被垃圾收集。所以內存消耗不會改變。儘管如此,將這些臨時字符串添加到池中會產生沒有任何好處的開銷,因爲實習需要某種查找,例如,哈希,並且垃圾收集器可能有額外的工作來清除池的引用。 – Holger

相關問題