2017-02-10 335 views
0

所以我讀過,如果你這樣寫:比較字符串

String a="foo"; 
String b="foo"; 
System.out.println(a==b); 

它會打印「真」,因爲第一個實施檢查存儲池尋找「 foo「,它無法找到它,因此它會創建一個新對象並將foo放入內存池中,然後每個其他字符串都將指向同一個對象。

,如果你寫:

String a="foo"; 
String b=new String("foo"); 
System.out.println(a==b); 

它會打印出「假」,因爲你強制創建爲B A新的對象,因此它不會把它從池。

我的問題是,如果你這樣寫:

String a=new String("foo"); 
String b="foo"; 
System.out.println(a==b); 

爲何仍打印「假」?我的意思是「a」創建一個新的對象,不會查找內存池,但是b應該查看內存池並找到創建的對象「a」並指向它。我在這裏錯過了什麼? 謝謝。

+0

一個不在記憶池,因此a和b都指向DIF引用.... –

+0

'字符串一個新=字符串( 「富」);'創建2個對象。首先創建'「foo」',然後用'new String'創建另一個。 – marstran

+0

這很容易,我們有一個字符串池用於字符串的目的,和對象的對象池,您不能比較字符串池中的字符串與對象池中的字符串對象使用==直接 – PSo

回答

1

當您創建新對象時,它不在池中。

b應該在內存池中查找並找到創建的對象「a」並指向它。

這是在游泳池,但它返回"foo"對象不是new String("foo")對象,以便==還是假的。

你可以把一個串入池.intern()

String a = "food".substring(0, 3).intern(); 
String b = "foo"; 
assert a == b; 
-1

字符串一個沒有去串池,串B那樣 - 這樣的引用是不同的。這就是爲什麼你會錯誤。

+0

這裏有三個'String a'聲明。你在說哪一個? – EJP

0

儘管公共池通常是堆的一部分,但通過new創建的對象永遠不會進入池中,因爲在創建時使用的文字會進入池中。當你比較文字時,你所說的將是真實的。不針對文字和對象。

1

String a="foo";

- >檢查字符串池,如果字符串池沒有之一,創建於字符串池一個新的String對象

String b="foo";

- >檢查字符串池,如果字符串池中包含它會對該String對象進行引用。

String c=new String("foo");

它直接字符串池外,但對象池(存儲器)創建一個新的String對象。

從對象的角度來看,2個字符串對象是相同的,所以如果您使用.equals比較這兩個,它會返回true。但是如果你使用==比較,它比較引用,它不是指向同一個對象,所以它返回false。

瞭解更多詳情: http://theopentutorials.com/tutorials/java/strings/string-literal-pool/

1

你誤會池的工作方式:當你

String a = "foo"; 

String對象"foo"在游泳池結束了,不是因爲你第一次創建它,而是因爲它是基於字符串文字(雙引號內的字符序列)的對象。 Java在常量池中爲你創建這個對象。

當你寫

String a = new String("foo"); 

從池中的字符串對象"foo"被複制到一個新的String對象,這是放入池中。