給大家出一道小兒科的題:
public class TestInteger {
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
long h = 2L;
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c == (a+b));
System.out.println(c.equals(a+b));
System.out.println(g == (a + b));
System.out.println(g.equals(a + b));
System.out.println(g.equals(a + h));
}
}
答案是多少呐,你一定在嘀咕這還不簡單呐,答案是
true
false
如果你這樣想,我隻能說你還太嫩,首先不公布答案呐,最後在公布,先分析分析
1.我們知道在編碼的時候能不用integer就不用這種包裝類,因為它有個裝箱和拆箱的過程,會浪費時間,
2.Integer的緩存範圍大家想必都知道就是-128(-2的7次方)到127(2的7次方-1)超出這個範圍就會在堆中重新配置設定記憶體,是以比較的值超出這個範圍位址就會不一樣
------------------------------------------------------------------------------------
再來說一下==這種運算法的比較,它的比較會先比較位址值,
如果比較的一邊有操作表達式,會比較數值
再來說一下equals
它在比較的時候會優先比較數值
但是Long類型的equals會首先判斷是否屬于Long,
------------------------------------------------------------------
好了公布正确答案
最後一個的解釋是,a+h,a是Integer,h是Long,在進行運算時,會自動轉化為Long類型的進行運算,是以是true
而倒數第二個a+b都是intrger類型的,是以不會進行轉化,是以還是Integer類型的與Long類型沒法比較。