2012-04-19 75 views
3

String對象在Java字符串可以在下面字符串字面VS Java中

  1. String foo="Test";
  2. String fooobj=new String("Test");

到處給出2種方式來創建它提到的關於創造的這兩個方法之間的差異串。我想知道更多關於什麼是適當的情況下的, 我們應該去

String foo="Test"; 

當去

String fooobj=new String("Test"); ? 
+0

檢查: http://stackoverflow.com/questions/3297867/difference-between-string-object-and-string-literal – 2012-04-19 07:55:18

+1

我不要求差別 字符串富= 「測試」; String fooobj = new String(「Test」);所以請首先閱讀我的問題 – 2012-04-19 08:06:56

回答

-2

的字符串是常量;它們的值在創建後無法更改。字符串緩衝區支持可變字符串。因爲String對象是不可變的,所以它們可以共享。例如:

 String str = "abc"; 

等同於:

 String str = new String("abc"); 

應該避免第二種方式來聲明一個字符串,說明理由到其他的答案

+0

這將是很好的,誰downvote可以解釋爲什麼......將是一個很好的幫助,瞭解哪裏有人犯了一個錯誤。謝謝。 – DonCallisto 2012-04-19 08:12:09

+0

@唐:你只需要看看這裏的其他答案。你說'String str =「abc」;'相當於'String str = new String(「abc」);'。這根本不正確。 – 2012-04-19 08:15:26

+0

@ T.J.Crowder:如果我們談論「字符串比較」和「對象比較」,我完全同意。但是這裏有人問到這兩個不同的聲明有什麼不同。而且,由於Java程序中的所有字符串文字(例如「abc」)都是作爲此類的實例實現的,唯一的區別是所有答案都顯示的區別。但看看這個:http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html – DonCallisto 2012-04-19 08:20:37

7

這是永遠需要創建一個新的String對象與

String fooobj = new String("Test"); 

所以,你不應該這樣做。改爲寫String fooobj = "Test";

類字符串是不可變的。這意味着一個String對象的內容在構造之後不能被改變。從來沒有必要創建一個字符串文字的明確副本。

11

簡短的回答:如果你有任何疑問,你不想要new String("literal here")。如果你需要它,你會知道你需要它,爲什麼。

長的答案:

從本質上講,如果你想確保所得到的字符串對象不是==其他任何字符串對象要使用new String("literal here")唯一的一次是。文字自動獲得interned;通過new String("literal here")創建的字符串不是。

那麼,你爲什麼要這麼做?答案是你幾乎永遠不會,因爲String實例是不可變的,所以你不在乎你是否與其他東西共享String實例。只是我能想象的唯一情況是,如果你有這樣的接受了String的API和你想比null其他的標誌值,和你想通過==檢查標誌/標記值,就像這樣:

public static final String MARKER = new String("Marker"); 
public void someFictionalMethod(String arg) { 
    if (arg == MARKER) { 
     // Take action on the marker 
    } 
    else { 
     // Take action on the string 
    } 
} 

...即使如此,我傾向於發現它有點懷疑,並會探索其他方式來做到這一點。

+1

這是真的。但是這樣的要求是非常罕見的,它使得其他答案(「從來沒有必要」)*幾乎*正確。 – 2012-04-19 07:56:11

3

你永遠不應該使用new String()。任何時候以這種方式創建字符串時,都會創建內存中的新對象。如果你編寫了String s = "aaa",那麼這個對象已經在給定的JVM中創建了,它存儲在字符串池中,並且感謝你的變量只是引用該已存在的對象 - 以這種方式安全地存儲內存。

0

當您使用第二種方法時,您實際上依賴於第一種方法來初始化構造函數參數。

所以問題是如果你可以通過第一種方法創建String對象,爲什麼你花費額外的努力來使用第二種方法?

我沒有看到使用第二個構造函數樣式的任何風景,因此始終堅持使用第一種方法。

0

String對象和字符串之間存在細微差別。

String s =「abc」; //創建一個String對象和一個引用變量 在這種簡單的情況下,「abc」將進入池中,s將引用它。

String s = new String(「abc」); //創建兩個對象和一個引用變量 在這種情況下,因爲我們使用new關鍵字,Java將在普通(非池)內存中創建一個新的String對象,並且s將引用它。另外,文字「abc」將被放置在池中。