美文网首页
2019-07-11 equals和==的区别

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

作者: 北子萌 | 来源:发表于2019-07-11 10:59 被阅读0次

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

    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和==的区别

          本文链接:https://www.haomeiwen.com/subject/illrkctx.html