2014-04-23 23 views
-1

當我們做什麼時候的Java創建的字符串

String a=new String("mac"); 
String b=new String("mac"); 

if(b == a) 
{ 
    System.out.println("condition 1 is true"); 
} 
if(b.equals(a)) 
{ 
    System.out.println("condition 2 is true"); 
} 

條件1失敗,條件2是真實的,因爲B和A是兩個不同的對象

但是,當我們做

String a="mac"; 
String b="mac"; 

    if(b == a) 
    { 
     System.out.println("condition 1 is true"); 
    } 
    if(b.equals(a)) 
    { 
     System.out.println("condition 2 is true"); 
    } 
一個新對象

這兩個條件都是真的。爲什麼沒有爲第二種情況創建一個新的對象。如果java僅在我們使用new()時創建一個新對象,那麼如果我們給這兩個字符串賦予不同的值,那麼java內部會發生什麼?

+0

相關:http://stackoverflow.com/questions/2009228/strings-are-objects-in-java-so-why-dont-we-use-new-to-create-them和http:// stackoverflow .com/questions/3801343/what-is-string-in-java –

+0

有多少重複項......讓我把它們計算在內...... –

回答

2

當你聲明如下圖所示,Java中創建的字符串常量池的字符串文字,無一不引用ab將把該字符串對象"mac"在游泳池

String a="mac"; 
String b="mac"; 

所以,無論是==.equals()返回true 。

但是,當您通過使用new運算符創建String對象時,String對象與Java中其他常規對象一樣在堆中創建。

因此==運算符將返回false,因爲兩個引用都指向堆中的兩個不同對象。

+0

是這是池和堆的概念 –

+0

另請參見String#intern() http://java-performance.info/string-intern-in-java-6-7-8/ – Toilal

相關問題