2011-12-30 39 views
27

我是java新手。爲什麼字符串不需要新的關鍵字

在java中,Stringclass。但 我們沒有使用new關鍵字來創建作爲地方是new用於創建其他類的對象String類的對象。

我聽說過類似IntegerDouble等包裝類。 但String不是包裝,不是嗎?

其實當我使用

 String message = "Hai"; 

發生了什麼事? 它是如何從

String message = new String("Hai"); 

這裏不同的是,message引用變量還是其他什麼東西? 是否有其他類不需要new來創建對象?

+0

sonu thomas :)! – jenuine 2014-12-16 11:38:07

+0

@jenuine hmmmm .... – 2014-12-17 01:18:43

回答

22

通過下面的一行沒有創建在堆中新String對象,但重用一個字符串(如果已經提供):

String message = "Hai"; 

"Hai"是在字符串常量池中字符串文字。因爲字符串是不可變的,所以它們是可重用的,所以它們被JVM彙集到字符串文字池中。這是推薦的方法,因爲您正在重複使用它。

但是,你實際上是在創建一個新的對象(堆)以下:

String message = new String("Hai"); 

new String("Hai")是一個新的String對象。在這種情況下,即使文字"Hai"已經在字符串文字池中,也會創建一個新對象。建議不要這樣做,因爲有可能以多個String對象具有相同的值結束。

也看到這個帖子:Questions about Java's String pool

是不需要新創建的對象還有其他類的?

事實上,你不能沒有使用關鍵字new在Java中創建的任何對象。

例如

Integer i = 1; 

不,並不意味着Integer對象不使用new創建。我們並不需要明確使用new關鍵字。但是,如果Integer值爲1的對象在緩存中尚不存在(Integer對象由JVM緩存),則將使用new關鍵字來創建它。

+0

我認爲'Integer'是原始類型爲'int'的Wrapper類。但字符串是**不是**原始的,不是嗎? – 2011-12-30 14:56:02

+1

是的,你是對的。 – 2011-12-30 15:00:31

6

字符串和整數的創建是不同的。

String s = "Test"; 

這裏'='運算符被重載爲字符串。 「一些」+「事物」中的「+」運算符也是如此。 哪裏,

Integer i = 2; 

直到Java 5.0這是編譯時錯誤;你不能分配原始的包裝。但是從Java 5.0開始,這被稱爲自動裝箱(auto-boxing),其中原語會在需要時自動提升到其包裝。

String h1 = "hi"; 

將不同於

String h2 = new String("hi"); 

的原因是JVM維護一個字符串表的所有字符串文字。所以在表格中會有一個「hi」的條目,比如它的地址是1000.

但是當你明確地創建一個字符串對象時,會創建一個新的對象,比如它的地址是2000.現在新對象將會指向字符串表是1000

因此,當你說進入

h1 == h2 

它比較

1000 == 2000 

所以它是假的

+1

'='運算符* NOT *重載。 Java爲字符串提供了一些語法糖,因此當您編寫「Hello,World」時,您會獲得一個對錶示給定字符流的「String」對象的引用。你隱式地在那裏創建一個對象(如果需要的話),但是這與'='操作符沒有任何關係。 – Darkhogg 2011-12-30 16:10:28

8

Java語言規範允許將字符串表示爲文字。你可以認爲這是一個快捷方式初始化爲具有一個重要的副作用,即通過

字符串文字是從常規初始化不同都實習,這意味着它們是由Java存儲常量字符串運行時間並可以在多個類中共享。例如:

class MainClass (
    public String test = "hello"; 
} 

class OtherClass { 
    public String another = "hello"; 

    public OtherClass() { 
     MainClass main = new MainClass(); 
     System.out.println(main.test == another); 
    } 
} 

會打印出「true」,因爲兩個String實例都指向同一個對象。如果您通過關鍵字初始化字符串,情況就不會如此。

+1

+1。很好,很簡潔。我們應該提到Java語言規範可以在http://java.sun上免費獲得。com/docs/books/jls /如果OP想真的潛入這一點。 – 2011-12-30 15:14:47

1

在java中
「==」中的

new String("hai")==new String("hai")

返回false情況下左&右手側的存儲器位置(而不是在該存儲器位置中的值),因此比較。

在「Hai」==「Hai」的情況下,java不會爲相同的字符串文字分配單獨的內存,因此這裏「==」返回true。您始終可以使用equals方法來比較值。

相關問題