2017-10-14 58 views
-2

For ==對兩個不同的對象s和p的變量使用new創建的結果作爲false(行1),我知道但爲什麼行3和4(行號註釋)給出true作爲輸出?爲什麼類Test的兩個不同對象的變量爲==操作賦予true,並且對於String對象而言,相同的操作會導致爲false?

我知道這個事實,==是用於參考比較,這是我的疑問,如果它是爲了參考比較,那麼爲什麼第4行給出真正的j是一個整數,並沒有不變性概念String(String s)和每次創建新對象都必須創建?

class World 
{ 
    public static void main(String[] args) 
    { 
     String s=new String("B"); 
     String p=new String("B"); 
     System.out.println(s==p);     //false line 1 
     Test t1= new Test("A",4); 
     Test t2= new Test("A",4); 
     System.out.println(t1==t2);     //false  line 2 
     System.out.println(t1.s==t2.s);    //true  line 3 
     System.out.println(t1.j==t2.j);    //true  line 4 
    } 
} 

class Test 
{ 
    String s; 
    int j; 
    Test(String s, int j) 
    { 
    this.s=s; 
    this.j=j; 
    } 
} 
+4

「*爲什麼第3行和第4行給出正確,因爲t1和t2是不同的對象*」 - 「t1」和「t2」是不同的對象,但您不在第3行比較它們。他們持有的琴絃,它們不是不同的物體。你有兩個引用相同的字符串文字'「A」',這與你在's'和'p'做的顯式創建新的'String'對象時有很大的不同。 – azurefrog

回答

1

字符串在java中通常緩存,所以兩個字符串具有相同值可能具有相同的參考。 (對於整數也是一樣,如果它們具有相同的值,則某個範圍內的對象被引用爲相同的對象)。這可能會導致與構造函數中的t1和t2的s值相同的對象「A」。如果兩個int基元具有相同的值,它們總是相同的。

+0

你能解釋一下這句話嗎「整數也是一樣的,如果它們具有相同的值,那麼在一定範圍內的對象被引用爲同一對象」 根據我的理解,只有在自動裝箱的情況下才會發生 –

+0

如果你有兩個小整數:Integer i1 = Integer.valueOf(127);整數i2 = Integer.valueOf(127);比較將導致i1 == i2。如果你在緩存區域之外有兩個整數,即Integer i1 = Integer.valueOf(1270); Integer i2 = Integer.valueOf(1270);那麼比較會導致i1!= i2。您可以通過簡單的單元測試來輕鬆驗證這一點。或者請參閱https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#valueOf(int) – juwil

+0

中的規範,對於內部使用valueOf()的Autoboxing,方法,正如你所提到的,但在上面的例子中,兩者都沒有發生。 –

1

在Java中,使用==運算符對兩個整數進行比較。同時在兩個字符串上使用==,或者您的兩個類將它們在內存中的位置進行比較,而不是它們的值。 你需要在Test類中小心,因爲你將你的類字段命名爲與你的參數相同的東西,所以你可能實際上不會將j和s的值賦值給你認爲的東西。 試着改變你的構造函數

Test(String str, int i){ 
    s = str; 
    j = i; 
} 
+0

因爲他用這個作業,所以不需要改變名字。這與問題無關。 – juwil

相關問題