基本类型通过==比较的是他们的值大小,而引用类型比较的是他们的引用地址。
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。