java开发:为什么重写Object的equals()必须要重写hashCode()

在开始讨论标题这个问题之前我们先搞清楚几个概念:

1.基本数据类型和引用类型

我们知道java数据类型一般有俩大类,第一种基本数据类型,第二种引用类型。基本数据类型是没有引用这个概念的,例如 int a = 1,a 是直接存放在堆栈中直接指向它的内容。而平时我们使用的User user = new User(),我们创建的对象是保存在堆中,user是引用类型,它保存在堆栈中,保存的内容是User对象在堆中的地址。

当我们使用 == 比较基本数据类型的时候是比较他们的值是否相等。
使用 == 比较俩个引用的时候是比较他们在内存中指向的是否是同个对象

 User user1 = new User();
 User user2 = new User();
System.out.println(user1==user2);

输出结果:false,因为user1 和user2 指向的是不同的内存地址。

在Object类的源码中有个equals()方法也可以用来比较俩个引用是否相同,它内部也是使用了 ==

 public boolean equals(Object obj) {
   
        return (this == obj);
    }

至于String类的equals()方法为什么当value值一样就返回true?
是因为String重写了equals()方法和hashCode()方法

 public boolean equals(Object anObject) {
   
        if (this == anObject) {
   
            return true;
        }
        if (anObject instanceof String) {
   
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
   
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值