1. 程式人生 > >equals和==方法比較(一)

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原始碼分析”這篇部落格。