2019-07-11 equals和==的区别

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方法,那就根据重写的规则来,例如下面的这段代码


2019-07-11 equals和==的区别_第1张图片
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

你可能感兴趣的:(2019-07-11 equals和==的区别)