一、問題描述
開發過程中遇到如下問題
Long a = 100L;
Long b = 100L;
System.out.println(a == b);
System.out.println(a.equals(b));
System.out.println(a == 100);
System.out.println(a.equals(100));
輸出結果:
true
true
true
false
但是當Long類型大於127時:
Long a = 128L;
Long b = 128L;
System.out.println(a == b);
System.out.println(a.equals(b));
System.out.println(a == 128);
System.out.println(a.equals(128));
輸出結果:
false
true
true
false
二、問題分析
查看源碼:java.lang.Long.java
LongCache會預先緩存-128–127範圍內的數,通過緩存頻繁請求的值代來更好的空間和時間性能,
當數據超出此範圍,則new一個Long對象;
“==”是比較的地址,超出此範圍的數據地址不一致,所以範圍內的比較是true,範圍外的數據是false;
而a==100則實現了類型的自動向上轉換,將int類型轉換成Long進行對比,所以輸出true;
在Long.java裏重寫了equals()方法,先進行類型對比,在進行值的對比,所以a.equals(100)輸出false;
三、解決問題方案
對於Long類型的對比,不要用“==”,儘量避免Long類型的直接對比
將Long轉換成基本類型再進行比較:a.longValue() == b.longValue(),或者0 == Long.compare(a, b);