討論這個問題以前咱們先放一段代碼html
public static void main(String[] args) {
Integer a1 = 2;
Integer a2 = 2;
System.out.println(a1==a2); //true
System.out.println(a1.equals(a2)); //true
Integer a3 = 127;
Integer a4 = 127;
System.out.println(a3==a4); //true
System.out.println(a3.equals(a4)); //true
Integer a5 = -128;
Integer a6 = -128;
System.out.println(a5==a6); //true
System.out.println(a5.equals(a6)); //true
/**
* ----
* */
Integer a11 = 128;
Integer a21 = 128;
System.out.println(a11==a21); //false
System.out.println(a11.equals(a21)); //true
Integer a1111 = -129;
Integer a2111 = -129;
System.out.println(a1111==a2111);//false
System.out.println(a1111.equals(a2111)); //true
}
上述代碼能夠看出 值相同的Integer對象作==操做,有的是true,有的是false,而equals操做的一直是true,爲何會出現這種狀況?spa
討論以前:先要知道對象的==操做,比較的是對象的地址code
對於 Integer var = ? 在-128 至 127 範圍內的賦值, Integer 對象是在IntegerCache.cache 產生,會複用已有對象,好比a1和a2,他們都是指向的同一塊內存空間,htm
對象的==操做,比較的是"地址",因此對於-128 至 127 範圍內的Integer 對象,值相同的integer對象都是指向的同一塊內存空間,因此這個區間內的 Integer 值能夠對象
直接使用==進行判斷,可是這個區間以外的全部數據,都會在堆上產生,並不會複用已有對象,這是一個大坑blog
對象的equals,比較的是對象的值,因此只要值相同的Integer對象,使用equals比較的結果,都會是true
內存
原文出處:https://www.cnblogs.com/zzh-blog/p/10688492.htmlclass