Integer是int的封裝類,是以在比較相等時一般使用equals,但是如果值在[-128,127]之間會在class常量池中存在,也就是說會放在IntegerCache中,在比較相等時需要注意一下。
有以下幾種情況:
Integer a=100
Integer b= 100
那麼a==b結果是true,a.equals(b)結果也是true
這裡之是以a==b結果為true是因為常量池區間内的資料用的是同一個引用。
Integer a=new Integer(100);
Integer b=new Integer(100);
那麼a==b結果是false,a.equals(b)結果是true
這裡之是以a==b結果為false因為new 出來的對象不在常量池中,不是同一個引用
Integer a=100
Integer b=new Integer(100);
那麼a==b結果是false,a.equals(b)結果是true
這裡之是以a==b結果為false因為new 出來的對象不在常量池中,不是同一個引用
int a=150
Integer b =150
那麼a==b結果是true,a.equals(b)結果是true
這裡a==b為true是因為b進行了拆箱Integer.intValue操作,把Integer轉化成了int,屬于基本類型比較,封裝類型和基本類型比較都會自動拆箱
Integer a =150
Integer b =150
Integer c=new Integer(150);
那麼a==b或者a==c結果都為false,a.equals(b)結果是true
這裡==比較都為false一方面說明了超出了常量池範圍,另一面說明Integer比較是不會拆箱的
總結如下:
兩個new 出來的Integer用==比較結果是false;
常量池中非new的兩個Integer 用==比較結果為true;
new出來的Integer和int用==比較結果都會為true,因為會對Integer對象進行拆箱。
看似簡單的Integer實際上卻存在諸多問題,但是大家隻要都用equals比較無論如何都不會出問題的,這也是大家都用equals的原因了。
剛剛也提到了拆箱,那你知道如何裝箱嗎?