String對象在Java字符串可以在下面字符串字面VS Java中
String foo="Test";
String fooobj=new String("Test");
到處給出2種方式來創建它提到的關於創造的這兩個方法之間的差異串。我想知道更多關於什麼是適當的情況下的, 我們應該去
String foo="Test";
當去
String fooobj=new String("Test"); ?
String對象在Java字符串可以在下面字符串字面VS Java中
String foo="Test";
String fooobj=new String("Test");
到處給出2種方式來創建它提到的關於創造的這兩個方法之間的差異串。我想知道更多關於什麼是適當的情況下的, 我們應該去
String foo="Test";
當去
String fooobj=new String("Test"); ?
的字符串是常量;它們的值在創建後無法更改。字符串緩衝區支持可變字符串。因爲String對象是不可變的,所以它們可以共享。例如:
String str = "abc";
等同於:
String str = new String("abc");
應該避免第二種方式來聲明一個字符串,說明理由到其他的答案
這將是很好的,誰downvote可以解釋爲什麼......將是一個很好的幫助,瞭解哪裏有人犯了一個錯誤。謝謝。 – DonCallisto 2012-04-19 08:12:09
@唐:你只需要看看這裏的其他答案。你說'String str =「abc」;'相當於'String str = new String(「abc」);'。這根本不正確。 – 2012-04-19 08:15:26
@ 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
這是永遠需要創建一個新的String對象與
String fooobj = new String("Test");
所以,你不應該這樣做。改爲寫String fooobj = "Test";
。
類字符串是不可變的。這意味着一個String對象的內容在構造之後不能被改變。從來沒有必要創建一個字符串文字的明確副本。
簡短的回答:如果你有任何疑問,你不想要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
}
}
...即使如此,我傾向於發現它有點懷疑,並會探索其他方式來做到這一點。
這是真的。但是這樣的要求是非常罕見的,它使得其他答案(「從來沒有必要」)*幾乎*正確。 – 2012-04-19 07:56:11
你永遠不應該使用new String()
。任何時候以這種方式創建字符串時,都會創建內存中的新對象。如果你編寫了String s = "aaa"
,那麼這個對象已經在給定的JVM中創建了,它存儲在字符串池中,並且感謝你的變量只是引用該已存在的對象 - 以這種方式安全地存儲內存。
當您使用第二種方法時,您實際上依賴於第一種方法來初始化構造函數參數。
所以問題是如果你可以通過第一種方法創建String對象,爲什麼你花費額外的努力來使用第二種方法?
我沒有看到使用第二個構造函數樣式的任何風景,因此始終堅持使用第一種方法。
String對象和字符串之間存在細微差別。
String s =「abc」; //創建一個String對象和一個引用變量 在這種簡單的情況下,「abc」將進入池中,s將引用它。
String s = new String(「abc」); //創建兩個對象和一個引用變量 在這種情況下,因爲我們使用new關鍵字,Java將在普通(非池)內存中創建一個新的String對象,並且s將引用它。另外,文字「abc」將被放置在池中。
檢查: http://stackoverflow.com/questions/3297867/difference-between-string-object-and-string-literal – 2012-04-19 07:55:18
我不要求差別 字符串富= 「測試」; String fooobj = new String(「Test」);所以請首先閱讀我的問題 – 2012-04-19 08:06:56