equals和==方法比較(一)


問題描述

今天在使用spotbugs代碼走查時發現這樣一個問題,兩個Long類型的變量使用==判斷數值是否相等,spotbugs提示這是一個很致命的錯誤,代碼大概如下,

Long l1=123l;
Long l2=123l;
System.out.println(l1==l2);

上面是兩個Long類型的變量l1和l2,打印的結果是true,再看下面的代碼,

Long l1=123456l;
Long l2=123456l;
System.out.println(l1==l2);

同樣是兩個Long類型的變量l1和l2,打印的結果卻是false,這是為什么那?

暴露的問題

上面的代碼,暴露下面兩個問題

1、包裝類型的兩個變量的數值比較不能使用==,應使用equals方法,;

2、為什么上面兩次的結果不一樣那,到底哪種情況下是對的;

問題剖析

數值的正確比較方式

從上面的代碼中可以看出,

1、變量l1和l2使用的是包裝類(Long),而不是基本數據類型long,我們知道對java中的兩個引用類型使用==比較符,比較的是兩個對象的引用地址是否相等;

2、對於基本數據類型,使用==比較符比較的是兩個變量的值是否相等,為此,下面的兩個代碼,都是true

long l3=123l;
long l4=123l;
//l3==l4  true
long l5=123456l;
long l6=123456l;
//l5==l6  true

3、對於基本類型的包裝類型的比較方式,請使用equals方法,下面的兩個代碼,都是true

Long l1=123l;
Long l2=123l;
System.out.println(l1.equals(l2));

Long l11=123456l;
Long l22=123456l;
System.out.println(l11.equals(l22));

這里有一個問題,為什么使用了equals方法上面的代碼都是true了,那是因為Long這個包裝類重寫了equals方法。

equals()方法源碼請查看“equals和==方法比較(二)--Long中equals源碼分析”這篇博客。

請記住,對於引用類型使用==比較符比較的是其引用地址,使用equals大都是比較的其內容,具體還要看重寫的equals方法的邏輯;

對基本類型使用==比較符比較的是字面量值是否相等;

針對暴露的問題2,請看“equals和==方法比較(三)--Long中LongCache源碼分析”這篇博客。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM