Long相關的比較問題

一、問題描述

開發過程中遇到如下問題

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);
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章