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

    }
    
}

结论:在进行枚举类的比较时,要多留点心,要意识到可能有坑。
 

感谢你浏览此文,欢迎交流。勿喷,你没给钱我也不欠你的。

相关文章
相关标签/搜索