String s = new String("abc");
它創建String
類型的對象具有值 「ABC」。 如果我寫:
String s = "abc";
這也創造與價值「ABC」的對象。 如何在不遇到新關鍵字的情況下創建對象。
另外,如果我寫:
s.append("def");
它創造了兩個字符串對象是:
a. "abcdef"
b. "def"
所以在遇到雙引號內的任何使一個新的String
對象。 這是怎麼發生的?
String s = new String("abc");
它創建String
類型的對象具有值 「ABC」。 如果我寫:
String s = "abc";
這也創造與價值「ABC」的對象。 如何在不遇到新關鍵字的情況下創建對象。
另外,如果我寫:
s.append("def");
它創造了兩個字符串對象是:
a. "abcdef"
b. "def"
所以在遇到雙引號內的任何使一個新的String
對象。 這是怎麼發生的?
是一個字符串字面值,由語言的規範定義。
參考JLS 3.10.5:
文字字符串由雙引號括起來的零個或多個字符。字符可以由轉義序列表示(§3.10.6) - 範圍U + 0000至U + FFFF中的字符的一個轉義序列,範圍U + 010000至中的UTF-16替代代碼單元字符的兩個轉義序列U + 10FFFF。
推薦閱讀:
此外,閱讀String is Really Special:
字符串字面被存儲在一個公共遊泳池。這有助於共享具有相同內容的字符串的存儲以節省存儲空間。通過新操作符分配的字符串對象存儲在堆中,並且相同內容不存儲共享。
String s1 = "Hello"; // String literal
String s2 = "Hello"; // String literal
String s3 = s1; // same reference
String s4 = new String("Hello"); // String object
String s5 = new String("Hello"); // String object
s1 == s1; // true, same pointer
s1 == s2; // true, s1 and s1 share storage in common pool
s1 == s3; // true, s3 is assigned same pointer as s1
s1.equals(s3); // true, same contents
s1 == s4; // false, different pointers
s1.equals(s4); // true, same contents
s4 == s5; // false, different pointers in heap
s4.equals(s5); // true, same contents
Exaclty:http://stackoverflow.com/questions/17489250/how-can-a-string-be-initialized-using/17489410#17489410 –
@sureshatta加上最重要的JLS參考,其次這個答案本身就是[this] (http://www.ntu.edu.sg/home/ehchua/programming/java/J3d_String.html),儘管它忽略了最重要的部分,你應該使用'=='和'equals()'來保持比較。 .. – NINCOMPOOP
它被稱爲一個String literal
,並且在指定了JLS 3.10.5:
字符串文字由包括在雙引號零個或多個字符。字符可以由轉義序列表示(§3.10.6) - 範圍U + 0000至U + FFFF中的字符的一個轉義序列,範圍U + 010000至中的UTF-16替代代碼單元字符的兩個轉義序列U + 10FFFF。
在Java中,當你做 「你好」,Java編譯器創建類似於new String("hello")
一個String對象。該對象在字符串池(String#intern())中維護。
SO在做String i = "hello"
。它通過檢查String#intern()
來檢查池中是否存在i
。如果是的話,它會重用它,否則它會創建一個新的並放入池中。有關更多info,請參閱此處。
由於他們都回答「abc」是一個字符串文字。對於第二部分的問題,即爲什麼在執行語句s.append("def")
之後爲什麼創建兩個對象,因爲在Java中字符串是不可變的。
只是供參考,雙引號稱爲引號:) – PunDefeated
可能有幫助:http://stackoverflow.com/questions/17489250/how-can-a-string-be-initialized-using/17489410#17489410 –