JAVA之Intege的==与equals方法的区别

基本类型通过==比较的是他们的值大小,而引用类型比较的是他们的引用地址。

Object中equals方法如下,是比较两个对象的引用地址,

public boolean equals(Object obj) {
        return (this == obj);

}

Integer类重写了Object的equals方法,方法如下:

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;

}

因此,Integer的equals方法比较的是对象的值。

Integer a1 = 127;

Integer b1 = 127;

System.out.println(a1 == b1);     true

System.out.println(a1.equals(b1));     true

Integer a2 = 128;

Integer b2 = 128;

System.out.println(a2 == b2);     false

System.out.println(a2.equals(b2));     true

之所以这里a2 == b2为false,是因为IntegerCache的cache数组中初始化存入了-128~127的对象,当Integer的内容不在这个区间内时,会重新创建对象,当Integer的内容在这个区间内时,会去cache数组中取,所以a1和a2指向了都是cache数组中存的对象,是同一个,所以地址值相同;128不在caceh数组中,所以a2和b2会分别创建两个对象,指向不同,所以地址值不同。而equals方法比较的是对象的值,所以不管地址相同与否,值相同则equals比较为true。

Integer a3 = 128;

int b3 = 128;

System.out.println(a3 == b3);     true

一个Integer与int比较,会先将Integer自动拆箱转换成int类型,再做值比较,所以a3与b3比较的是值,为true。


猜你喜欢

转载自blog.csdn.net/xiaoying0531/article/details/79700412