两个 Object 不同为什么他们的hashcode有可能相同

1、写在前面:
对于一个不是那么白的小白,写这篇文章主要是告诫自己在以后工作生活中要对一个知识点,一个事情要完全弄懂,弄明白!同时也是对知识的巩固

场景:
  面试官:两个 x.equals(b)==true ,hashcode是否相同
  我        :相同
  面试官:hashcode相同,两个对象是否相同
  我        : (思考ing)不一定相同

2、为什么不一定相同

我们来验证一下:

@Data
    static
    class Mode{
        private String name;
        private String value;

		//重载
       public int hashCode(){
            return 1;
        }

        public Mode(String name, String address) {
            this.name = name;
            this.value = address;
        }


        @Override
        public boolean equals(Object obj) {
            System.out.println("这是equals方法");
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Mode other = (Mode) obj;
            if (value == null) {
                if (other.value != null)
                    return false;
            } else if (!value.equals(other.value))
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }


        @Override
        public String toString() {
            return "model [name=" + name + ", address=" + value + "]";
        }

    }
public static void main(String[] args) {
        HashSet<Mode> hashSet = new HashSet<>();
        hashSet.add(new Mode("1", "A"));
        hashSet.add(new Mode("2", "0"));
        hashSet.add(new Mode("2", "1"));

        Iterator<Mode> iterator = hashSet.iterator();

        System.out.println("哈希值:");
        System.out.println(new Mode("1", "A").hashCode());
        System.out.println(new Mode("2", "a").hashCode());
        System.out.println(new Mode("2", "1").hashCode());

        System.out.println("遍历:");
        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }


打印结果:
这是equals方法
这是equals方法
这是equals方法
哈希值:
1
1
1
遍历:
model [name=1, address=A]
model [name=2, address=0]
model [name=2, address=1]
	

3、总结

  1. 对象相等则hashCode一定相等;
  2. hashCode相等对象未必相等
    3)hashCode是所有java对象的固有方法,如果不重载的话, 返回的实际上是该对象在jvm的堆上的内存地址,而不同对象的内存地址肯定不同,所以这个hashCode也就肯定不同了。 如果重载了的话,由于采用的算法的问题,有可能导致两个不同对象的hashCode相同
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行人已

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值