首页 > 其他 > 详细

关于==和equals()方法

时间:2020-12-08 14:05:25      阅读:26      评论:0      收藏:0      [点我收藏+]
  • ==
    • 对于值对象,==比较的是两个对象的值
    • 对于引用对象,==比较的是两个对象的地址
  • 默认的equals()方法是等价==
    • 之所以会有差异,是因为equals方法可以进行重写
public class Test {
    public static void main(String[] args) {
        String a = "hello";
        String b = "hello";
        String c = new String("hello");

        //在java中字符串的值是不可改变的,相同的字符串在堆内存中只会存一份,所以a和b指向的是同一个对象;
        System.out.println(a==b);//true

        //a和c在堆内存中的地址不同(c是新开辟的),所以a和b指向的不是同一个对象;
        System.out.println(a==c);//false

        //这里的equals等价于==,因为a和b地址相同
        System.out.println(a.equals(b));//true

        //这里equals比较后两个不同的对象,但结果确实true
            //说明Strung重写过了equals方法
        System.out.println(a.equals(c));//true

        //ab为同一个对象,应该拥有相同的hashcode,但c为另一个对象,hashchode应该不同
            //说明String重写了hashcode
        System.out.println(a.hashCode());
        System.out.println(b.hashCode());
        System.out.println(c.hashCode());

    }
}

内存分析

技术分享图片

查看String中的源码

可以看出在String类中对euqals()方法和hashcode方法进行了重写

  • equals
技术分享图片
  • equals
技术分享图片

由此得出结论

  • hashcode
    • 因为重写的存在,hashcode相同可能不是同一个对象
    • hashcode不同的一定不是同一个对象的
  • equals
    • 因为重写的存在,两个对象euqals相等,不一定是同一个对象,如果hashcode没有重写,hashcode也不一定相等,因为从Object继承来的hashCode是基于对象的ID实现的。

相同的对象,应该拥有相同的地址和hashcode,因此在判断两个对象是否相同时需要同时重写hashcode,和equals方法

参考资料hashcode详解 - 有梦想的老王 - 博客园 (cnblogs.com)

关于==和equals()方法

原文:https://www.cnblogs.com/Sheltonz/p/14101868.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!