2015-10-20 28 views
1

在以下代碼段中創建了多少個不同的String對象實例?計數不同的字符串對象實例

String s1 = new String("hello"); 
String s2 = "GoodBye"; 
String s3 = s1; 

不確定我在這裏的所有推理。

通過使用從String類創建實例的關鍵字new,我猜測這必須是一個對象。然而,我很困惑,現在new現在被認爲是一種方法,因爲它有(),然後它正在調用一個String文字「hello」在String之後呢?

String s2 = "Goodbye"; 我認爲這是一個字符串字面值,並且由於字符串實際上是對象,所以即使字符串字面量被視爲對象。 不是100%確定是否屬實。

String s3 = s1;只是指向s1。因此,這並不明顯。

所以我的答案是2個不同的對象。

請說明我是對還是錯。

+2

@YassinHajaj難道不是3個對象?兩個在字符串池中(文字),另一個由構造函數創建。 –

+0

@YassinHajaj *「一個在字符串池中」*以及哪一個?由於他有兩個文字必須有人來決定。 – Tom

+1

可能重複[有多少個對象用new操作符創建?](http://stackoverflow.com/questions/6633852/how-many-object-creates-with-new-operator) – Tom

回答

6

正確答案是3

String s1 = new String("hello"); 
String s2 = "GoodBye"; 
String s3 = s1; 

編譯器會把這兩個文字「你好」「再見」到在編譯時一個「常量池」,然後將被載入類加載器。因此,當它加載該類時,JVM會自動實例化該類使用的所有String文字。更多關於此:When are Java Strings interned?String constant pool然後在運行時進行管理。

在運行時,JVM將在到達行String s1 = new String("hello")時創建第三個String對象。

所以你會和三個不同的字符串對象,其中兩個包含相同的單詞「你好」。因此s1.equals("hello")將是true,但s1 == "hello"將是false,因爲s1引用堆上的不同字符串,而不是字面「hello」

String s3 = s1只是創建一個變量s3與對s1的String對象的複製引用。它不是創建一個新的對象。

另外請注意,您可以使用方法String#intern「手動」將字符串添加到字符串常量池中。所以s1.intern() == "hello"true,因爲從s1.intern()返回的字符串引用是對已經在常量池中的文字「hello」的引用。

如果您想了解更多關於物體及其位置的更多詳細解釋,可以查看this article on javaranch

+0

我大失所望。很高興學習tho :) +1 – sam

+0

唉我在記錄最後的評論,現在這些被永久摧毀...... –

+1

@ sam2090(第一評論):當你使用搜索引擎搜索類似的問題,當你將看到很多用戶對此感到困惑。所以不用擔心:)。 – Tom

相關問題