2013-07-23 38 views
0

如果我寫:java如何將引號中的任何內容識別爲字符串對象?

String s = new String("abc"); 

它創建String類型的對象具有值 「ABC」。 如果我寫:

String s = "abc"; 

這也創造與價值「ABC」的對象。 如何在不遇到新關鍵字的情況下創建對象。

另外,如果我寫:

s.append("def"); 

它創造了兩個字符串對象是:

a. "abcdef" 
b. "def" 

所以在遇到雙引號內的任何使一個新的String對象。 這是怎麼發生的?

+6

只是供參考,雙引號稱爲引號:) – PunDefeated

+0

可能有幫助:http://stackoverflow.com/questions/17489250/how-can-a-string-be-initialized-using/17489410#17489410 –

回答

6

​​是一個字符串字面值,由語言的規範定義。

參考JLS 3.10.5

文字字符串由雙引號括起來的零個或多個字符。字符可以由轉義序列表示(§3.10.6) - 範圍U + 0000至U + FFFF中的字符的一個轉義序列,範圍U + 010000至中的UTF-16替代代碼單元字符的兩個轉義序列U + 10FFFF。

推薦閱讀:

  1. Difference between string object and string literal
  2. Java String Pool

此外,閱讀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 

enter image description here

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 
+1

Exaclty:http://stackoverflow.com/questions/17489250/how-can-a-string-be-initialized-using/17489410#17489410 –

+0

@sureshatta加上最重要的JLS參考,其次這個答案本身就是[this] (http://www.ntu.edu.sg/home/ehchua/programming/java/J3d_String.html),儘管它忽略了最重要的部分,你應該使用'=='和'equals()'來保持比較。 .. – NINCOMPOOP

8

它被稱爲一個String literal,並且在指定了JLS 3.10.5

字符串文字由包括在雙引號零個或多個字符。字符可以由轉義序列表示(§3.10.6) - 範圍U + 0000至U + FFFF中的字符的一個轉義序列,範圍U + 010000至中的UTF-16替代代碼單元字符的兩個轉義序列U + 10FFFF。

0

在Java中,當你做 「你好」,Java編譯器創建類似於new String("hello")一個String對象。該對象在字符串池(String#intern())中維護。

SO在做String i = "hello"。它通過檢查String#intern()來檢查池中是否存在i。如果是的話,它會重用它,否則它會創建一個新的並放入池中。有關更多info,請參閱此處。

0

由於他們都回答「abc」是一個字符串文字。對於第二部分的問題,即爲什麼在執行語句s.append("def")之後爲什麼創建兩個對象,因爲在Java中字符串是不可變的。

相關問題