2013-07-08 149 views
5

任何人都可以告訴我輸出更改的原因。遞增和遞減更改對象值

public class Demo { 
    public void demo() 
    { 
     Integer y = 567; 
     Integer x = y; 
     System.out.println(x + " " + y); 
     System.out.println(y == x); 
     y++; 
     System.out.println(x + " " + y); 
     System.out.println(y == x); 
     y--; 
     System.out.println(x + " " + y); 
     System.out.println(y == x); 
    } 
    public static void main(String args[]) 
    { 
     Demo obj = new Demo(); 
     obj.demo(); 
    } 
} 

輸出

567 567 

true 

567 568 

false 

567 567 

False 

這裏爲什麼我得到最終假的。

+2

嘗試y.equals(x)而不是==。 – gcandal

回答

1
Integer y = 567; // y=567 
    Integer x = y; // x is equal to y object 
    System.out.println(x + " " + y); // out put x and y so obviously x and y are 567 
    System.out.println(y == x); // here x and y are in same reference. so this x==y is true and out put is true. 
    y++; // increment y by 1. then y=568 
    System.out.println(x + " " + y); // now x= 567 and y= 568 
    System.out.println(y == x);// now x not equals to y then false will print 
    y--; // again decrement y value 
    System.out.println(x + " " + y); // again x and y are same 567 
    System.out.println(y == x);// here y.value == x.value but x and y object wise not equal since object x and y are referring deference points 
+0

錯誤,'=='**總是**做對象引用檢查。對第二個「假」的解釋是不正確的。 –

+0

@BuhakeSindi我的意思是。但你錯了。現在我改變一些話 –

0

因爲x和y指的是2個不同的對象。

y--; 

這首先將y解釋爲int,而不是遞減它,而不是將它放到Integer中。這個新的盒裝整數指的是不同的內存位置。

理想情況下,在包裝類上,它最好在包裝對象而不是==運算符上調用equals方法。

0

y == x檢查內容是否相等,即它們是否指向相同的對象,而不是它們指向的對象是否包含相同的int。特別是當x, y >= 128

使用

y.equals(x); 

(int) y == (int) x 

或聲明xyint代替。

請注意,自動拆箱不會發生在Integer == IntegerInteger != Integer

3

更改

Integer y = 567; 
    Integer x = y; 

int y = 567; 
    int x = y; 

和suprprising行爲將不復存在。我的猜測是,你已經偶然發現Java的隱含原始值隱含自動裝箱到包裝對象,並導致相信你直接操縱數字。

0

當您使用原始int而不是Integer。最終的輸出將是true

但是,當您使用Integer類時,這些是Object s。如果使用equals方法,最終輸出將爲true

+0

'當你使用Integer而不是原始的int。最終的結果是真的。什麼? –

+0

@BuhakeSindi - Typo。 – JHS

5

您正在使用Integer這是一個不可變的對象。

基本上你的代碼是

y = new Integer(y.intValue() + 1); 

y = new Integer(y.intValue() - 1); 

因此要創建兩個新的Integer對象是不一樣的(==)作爲前述目的。

這種行爲在Java中被稱爲自動裝盒

+1

編譯器將使用'Integer.valueOf()'而不是構造函數。 –

+0

@BuhakeSindi我使用構造函數使其更加清晰,而不是顯示JVM在做什麼。 –

2

這是因爲編譯器這個內部:

y-- 

表示:

int _y = y.intValue(); 
_y--; 
y = Integer.valueOf(_y); 

因此,y是有一個新的Integer實例。你正在做對象引用檢查(當使用==時)而不是值相等檢查。使用equals()方法來評估2個值。

-1

甚至,如果你創建

Integer a = new Integer(1000); 
Integer b = new Integer(1000); 

一個== b - 假

Integer a = new Integer(1); 
Integer b = new Integer(1); 

一個== b - 是真的

,在Java中一個小整數的緩存:-127到128.所有其他整數是新創建的對象,它們不能等於。

+0

在Java中,new'operator ** always **爲新對象分配內存。這與'public static Integer valueOf(int i)'方法相反,該方法從內部緩存中獲取您的答案中指定範圍的整數,否則返回一個新整數。 – skuntsel