java中的==和equals方法,需记住两条规则:
1.对于==,如果作用于基本数据类型的变量,则直接比较其存储的 "值"是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2. 对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行 重写,则比较的是引用类型的变量所指向的 对象的地址;
诸如String,Date,Integer等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
Object可理解为老祖宗,如果在别的类中看到equals方法,可认为是方法重写,这样比较的是所指向的对象的内容。
Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2);//false
System.out.println(i1.equals(i2));//true
两个对象的自地址值不同,所以==的时候是false,
而equals方法比较的是内容,所以是true.
Integer i5 = 128;
Integer i6 = 128;
System.out.println(i5 == i6);//false
System.out.println(i5.equals(i6));//true
以及
Integer i7 = 127;
Integer i8 = 127;
System.out.println(i7 == i8);//true
System.out.println(i7.equals(i8));//true
两个为何不属于上面的两条规则呢?
因为查看源码得知:
Integer i = 128;//相当于Integer integer = Integer.valueOf(128);
static final int low = -128;
static final int high= 127;
public static Integer valueOf(int i) {
//如果在-128到127之间,就直接从缓冲区里获取数据
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
//如果不在-128到127的范围,那么会新建对象
return new Integer(i);
}
注意:Integer的数据直接赋值,如果在-128和127之间,直接从缓冲池里获取数据。
IntegerCache.low 和IntegerCache.high的范围是: