差異

2013-02-19 75 views
-3
之間的兩個字符串聲明

究竟什麼是據我所知這兩個聲明差異

String s1="abc"; 
String s2=new String("abc"); 

之間的區別在於,第一條語句將創建字符串池即一個對象,S1將冷藏它。 在第二份聲明中,將創建兩個對象,因爲我用新的關鍵字和S2將參考對象在字符串池現在

如果我另一個。自後,執行這兩個聲明一會的第一個語句對象「ABC」將是在字符串池和第二個語句的執行s2將引用該對象,這是在字符串池alreday是如果我做s1 == s2它應該返回true,但它返回false。

你能解釋一下爲什麼嗎?

+0

和這個:http://stackoverflow.com/questions/6191086/whats-the-difference-between-string-and-new-string?rq=1 – 2013-02-19 18:12:27

+0

該鏈接不包含我在找什麼。 。 – user728907 2013-02-19 18:14:10

+1

@ user728907鏈接正確地回答你的問題 – cIph3r 2013-02-19 18:15:54

回答

1

您正在創建兩個不同的對象。 s1有它自己的內存來保存它的參考地址。和s2一樣。儘管這兩個對象都指向字符串池中的相同字符串,但對象本身是不同的。因此,s1 == s2將失敗。

s1.equals(S2),但是,將工作,因爲你是比較字符串的內容

+0

糾正我,如果我錯了,但如果我們不重寫equals方法,它的默認行爲是==,所以它爲什麼會返回true。(不知道這是否是一個邏輯問題) – user728907 2013-02-19 18:18:14

+1

equals的字符串實現覆蓋Object.equals。它檢查字符串的內容,而不是對象本身 – 75inchpianist 2013-02-19 18:19:18

4

事實是String s1="abc"分配串池,這是一個特殊的地方,其中不變的字符串裏面保存的字符串。您將無法直接修改​​,而只能修改指向它的參考(s1)。

第二種情況String s2=new String("abc")您正在分配一個真正的字符串對象,它在內部有一個char[]緩衝區,其中存儲了字符串數據。它像第一個一樣是不可變的,但是它是堆上的一個對象。

當你比較s1 == s2,因爲你是比較引用,它們是不同的,因爲指向字符串池中的字符串(我實際上不確定是否創建包裝對象或直接引用池中的對象),而第二個指向您明確創建的對象(包含存儲數據的char[]緩衝區)。

+0

第二條語句將在真正的堆中創建兩個對象,並在字符串常量池中創建另一個對象....如果我錯了,請糾正我,因爲abc已經在那裏了(因爲String s1 =「abc」)s2將引用已經是...的字符串...所以基本上s1和s2都會引用兩個相同的字符串... plaese糾正我在哪裏ia m缺少點 – user728907 2013-02-19 18:26:47

+1

no,'s2'指向指向字符串池中的字符串的對象。不要直接輸入字符串。 – Jack 2013-02-19 18:29:50

+0

所以我得到它是否意味着s1指的是字符串池中的abc 而s2指向一個字符串中的字符串池中的對象....可以嗎? – user728907 2013-02-19 18:34:56