1. 程式人生 > >Integer之間比較大小

Integer之間比較大小

class Test {
    public static void main(String[] args) {
        Integer i1 = new Integer(5);
        Integer i2 = new Integer(5);
        System.out.println(i1 == i2); //false (情況,即new的id,而不是=的id賦值)

        Integer i3 = 5;
        Integer i4 = 5;
        System.out.println(i3 == i4); //true
    }
}

所以判斷Integer相等的值最好不要用==
下面為更為詳細的解析:

public static void main(String[] args) {  
        Integer a1 = Integer.valueOf(60);  //danielinbiti  
        Integer b1 = 60;    
        System.out.println("1:="+(a1 == b1));     


        Integer a2 = 60;    
        Integer b2 = 60;    
        System.out.println("2:="+(a2 == b2));    


        Integer a3 = new
Integer(60); Integer b3 = 60; System.out.println("3:="+(a3 == b3)); Integer a4 = 129; Integer b4 = 129; System.out.println("4:="+(a4 == b4)); }

上述程式碼的答案,涉及到Java緩衝區和堆的問題。

java中Integer型別對於-128-127之間的數是緩衝區取的,所以用等號比較是一致的。但對於不在這區間的數字是在堆中new出來的。所以地址空間不一樣,也就不相等。

Integer b3=60,這是一個裝箱過程也就是Integer b3=Integer.valueOf(60)

所以,以後碰到Integer比較值是否相等需要用intValue()

對於Double沒有緩衝區。

答案

1:=true
2:=true
3:=false
4:=false

(總結:這就歸結於java對於Integer與int的自動裝箱與拆箱的設計,是一種模式:叫享元模式(flyweight)
為了加大對簡單數字的重利用,java定義:在自動裝箱時對於值從–128到127之間的值,它們被裝箱為Integer物件後,會存在記憶體中被重用,始終只存在一個物件
而如果超過了從–128到127之間的值,被裝箱後的Integer物件並不會被重用,即相當於每次裝箱時都新建一個 Integer物件(還是需要用equals來比較,已經重寫);

以上的現象是由於使用了自動裝箱所引起的,如果你沒有使用自動裝箱,而是跟一般類一樣,用new來進行例項化,就會每次new就都一個新的物件;