問題描述
今天在使用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源碼分析”這篇博客。