Java類型比較的問題

注:本文適用於JDK1.6及JDK1.7,更高的JDK版本未驗證過。緩存

作Java開發的都知道「==」和equals的區別,基本數據類型的值比較的時候使用「==」,對象類型的值比較的時候用equals。固然,這些都是最基本,這裏只是順便提一下。app

下面來講一些特殊的狀況:測試

第一種狀況,對於基本數據類型的包裝類,例如int對應的Integer,有時候可能也會使用「==」去比較,數值介於-128~127(含-128和127)之間不會有問題,由於Java虛擬機會在內存裏緩存這部分數據,可是在這個範圍以外的比較使用「==」就有問題了。代碼以下,一看就懂:ui

// 注:節省篇幅,註釋省掉了this

public class TestInteger {
    public static void main(String[] args) {
        Integer int1 = 108;
        Integer int2 = 108;
        Integer int3 = 168;
        Integer int4 = 168;
        int i1 = 168;
        
        System.err.println(int1 == int2); // true
        System.err.println(int3 == int4); // false
        System.err.println(int3.equals(int4)); // true
        System.err.println(int3 == i1); // true
    }
}spa

結論:對於對象數據類型,不管是不是包裝類,一概使用equals來比較對象的值。(在elipse裏能夠經過findbugs檢查出此類問題)對象

 

第二種狀況,對於枚舉類Java開發人員應該也比較熟悉。枚舉類的比較須要注意,看枚舉類的源碼也知道,枚舉類在比較時並未進行類型檢查,Java的語法也沒有作這件事情,這意味着在有些測試不充分的狀況下容易犯錯誤。代碼以下:ip

// 注:節省篇幅,註釋省掉了內存

public class TestEnum {開發

    public static void main(String[] args) {
        Integer int1 = 0;
        System.err.println(EFruit.apple.equals(int1)); // false 類型雖不一樣,Java語法並無強制檢查
        System.err.println(EFruit.apple.getId().equals(int1)); // true
    }

    public enum EFruit {

        apple(0, "蘋果"), orange(1, "桔子"), banana(2, "香蕉");

        private Integer id;
        private String name;

        private EFruit(Integer id, String name) {
            this.id = id;
            this.name = name;
        }

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

    }
    
}

結論:在進行枚舉類的比較時,要多留點心,要意識到可能有坑。
 

感謝你瀏覽此文,歡迎交流。勿噴,你沒給錢我也不欠你的。

相關文章
相關標籤/搜索