2015-10-28 60 views
5
String a = "abc"; 
String b = a.substring(1); 
b.intern(); 
String c = "bc"; 
System.out.println(b == c); 

這個問題可能是愚蠢的,因爲實習生在這裏沒有什麼大用法,我仍然對事實感到困惑,爲什麼b == c結果爲true實習生如何在下面的代碼中工作?

String b = a.substring(1) 

執行,字符串b對對象有"bc"

是否b.intern在字符串常量池中創建字面"bc",即使是這樣,如何trueb==c結果呢?

+1

請親自看看[intern]的文檔(https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#intern) –

回答

5

String b = a.substring(1);返回包含"bc"字符串實例,但這種情況是不串池的一部分(僅文字被拘留默認值,通過new String(data)創建的字符串和類似方法返回substringnextLine默認情況下不會被攔截)。

現在,當你調用

b.intern(); 

這種方法檢查字符串池包含字符串等於一個存儲在b(這是「BC」),如果不是,它把這個字符串存在。所以正弦沒有代表"bc"的字符串,它會在b處放置字符串。

所以現在字符串池包含​​和"bc"

正因爲如此,當你調用

String c = "bc"; 

字符串字面量代表bc(這是相同b參考)將從池中重複使用,這意味着bc將舉行相同的實例

這確認了b==c的結果,其返回true

+0

可以downvoter解釋我錯過了什麼? – Pshemo

+0

但字符串b指向一個包含「bc」的對象, b.intern();只是把「bc」放在字符串池中,當我們執行時 字符串c =「bc」它從字符串池中獲取引用,而字符串b指向包含「bc」的對象。 b和c如何包含相同的參考。請讓我知道我的錯在哪裏 –

+0

我不是選民,但是這個*「因此正弦沒有字符串表示」bc「在游泳池」*聽起來不對,因爲「bc」已經在游泳池中,因爲在類加載期間將會實現字符串(來自String c =「bc」')。 – Tom

5

String#intern()方法

的DOC當實習生方法被調用時,如果池已經包含一個字符串等於由equals確定此字符串對象(Object)方法,然後是串從游泳池返回。否則,將此String對象添加到池中,並返回對此String對象的引用。

現在,按照意見

String b = a.substring(1); // results "bc" 
    b.intern();     // check and places "bc" in pool 
    String c = "bc";   // since it is a literal already presented in pool it gets the reference of it 
    System.out.println(b == c);// now b and c are pointing to same literal 
+0

Downvoter,小心解釋這是什麼原因? –

+0

感謝您的快速回復,但沒有字符串b仍然指向內存中有bc的對象? b.intern返回字符串池中的引用,但它不會將參考保存在任何地方 –

+0

調用'b。intern()對'b'沒有任何作用,但它將它所指向的字符串的副本放入字符串池中。運行這段代碼的結果將是'false'。代碼應該有'b = b.intern();'。 – EJP

相關問題