Integer之間比較大小
阿新 • • 發佈:2019-02-07
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就都一個新的物件;