2012-01-04 137 views
3

我在此搜索過,但關鍵字必須過於籠統以縮小相關位數。爲什麼在android中聲明一個字符串是有效的兩種方式,並且有什麼區別?在Android中String foo =「bar」與String foo = new String(「bar」)?

+1

它們是一樣的。我建議檢查一下:http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html你基本上實例化一個新的String對象實例。 – Robert 2012-01-04 15:54:54

+1

字符串是不可變的,所以我懷疑沒有區別。你可以檢查每個生成的字節碼是否有差異。 – Mitch 2012-01-04 15:55:11

+0

可能應該關閉[String vs new String()]的副本(http://stackoverflow.com/questions/3052442/what-is-the-difference-between-text-and-new-stringtext-in-java ) – Sulthan 2012-01-04 16:05:26

回答

4

使用new關鍵字,您將創建一個新的字符串對象,其中使用foo = "bar"將進行優化,以指向在應用程序中不同位置使用的相同字符串對象。

對於instacne:

String foo = "bar"; 
String foo2 = "bar"; 

編譯器將優化上述代碼是相同的確切的對象[foo == foo2,在conradiction到foo.equals(foo2)]。

編輯:經過一番搜索,@蘇爾坦是正確的。它不依賴編譯器的問題,它是在specs

字符串文字總是指向類 字符串的同一實例(第4.3.1節)。

+0

這不是由編譯器決定的。行爲是嚴格定義的。 – Sulthan 2012-01-04 16:04:40

+0

@Sulthan:你能否提供一些對該陳述的參考?我沒有看到它的規格,但會很樂意修改我的答案,如果可以提供。 – amit 2012-01-04 16:05:50

+0

「String.intern()」的文檔。 '所有文字字符串和字符串值常量表達式都被禁止了' – Sulthan 2012-01-04 16:08:28

0

這不僅是關於Android,關於Java。

當你寫"xxxx"它是一個文字字符串。這是一個String實例。請注意,具有相同值的所有文字字符串都是相同的實例。有關詳細信息,請參閱方法String.intern()

實施例:


String s1 = "abc"; 
String s2 = "abc"; 
在這個例子中

s1 == s2是真實的。

new String("xxx")是複製構造函數。你需要一個字符串(文字),並從中創建一個新的實例。由於所有字符串都是不可變的,通常這是你不想做的事情。

實施例:


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

s1.equals(s2)爲真
s1 == s2是假

0
String x = new String("x") 

有效地創建2個字符串。一個用於文字(這是一個沒有變量名稱的表達式),另一個則保留爲x。它是一樣的:

String x; 
{ 
    String a = "x"; 
    x = new String(a); 
} 
相關問題