equals的五个特性:
1 自反性:对任意引用值X,x.equals(x)的返回值一定为true;
2 对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
3 传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true ;
4 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变;
5 非空性:任何非空的引用值X,x.equals(null)的返回值一定为false 。
equals方法最初是在所有类的基类Object中进行定义的,源码是
public boolean equals(Object obj) {
return (this == obj);
}
由equals的源码可以看出这里定义的equals与==是等效的(Object类中的equals没什么区别),不同的原因就在于有些类(像String、Integer等类)对equals进行了重写,但是没有对equals进行重写的类(比如我们自己写的类)就只能从Object类中继承equals方法,其equals方法与==就也是等效的,除非我们在此类中重写equals。
如果重写了equals方法,那就根据重写的规则来,例如下面的这段代码
若A==B 即是同一个String对象 返回true2.若对比对象是String类型则继续,否则返回false3.判断A、B长度是否一样,不一样的话返回false4。逐个字符比较,若有不相等字符,返回false
equals方法与hashcode的辨析
1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
2、如果两个对象不equals,他们的hashcode有可能相等。
3、如果两个对象hashcode相等,他们不一定equals。
4、如果两个对象hashcode不相等,他们一定不equals。
==的比较:
比较的是两个对象的地址是不是相同的,JAVA的Integer会缓存-128到127之间的对象
如:Integer x = 100,会调用Integer的valueOf()方法,这个方法就是返回一个Integer对象,但是在返回前,作了一个判断,判断要赋给对象的值是否在[-128,127]区间中,且IntegerCache(是Integer类的内部类,里面有一个Integer对象数组,用于存放已经存在的且范围在[-128,127]中的对象)中是否存在此对象,如果存在,则直接返回引用,否则,创建一个新对象返回
Integer i02 = 59;
Integer i03 = Integer.valueOf(59);
Integer i04 = new Integer(59);
System.out.println(i02 == i03); //true 因为59位于缓存区间直接从缓存中获取
System.out.println(i02 == i04); //false
System.out.println(i03 == i04); //false
还有一个例子
Integer i02 = 200;
Integer i03 = Integer.valueOf(200);
Integer i04 = new Integer(200);
System.out.println(i02 == i03); //false 因为200超出缓存区间从新创建对象
System.out.println(i02 == i04); //false
System.out.println(i03 == i04); //false