HashCode和equals

本文深入解析Java集合操作中的equals与hashCode原理,包括它们如何用于判断对象等价性和在集合中实现高效查找。重点阐述了在添加元素至集合时,先通过hashCode进行初步筛选,若不相等则进一步使用equals方法验证。同时,解释了hashCode和equals两者之间的关系及应用场景,特别强调了在实际开发中正确使用这两个方法的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.equals如果没有重写的话是比较地址和==效果一样

2.==比较的是对象的引用地址

3.hashcode的比较是在集合中才会使用到,比如HashSet中的add方法:

  public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key);
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

从上面的源码可以看出来,如果是集合中的操作,首先判断的是hashcode是否相等,如果不相等直接将数据添加,否则还要用equals判断是否相等,如果hashcode和equals比较都是相等的,那么就将值替换。

总结:

【1】equals是判断两个对象是否对等,这个理解起来很简单,不用多说;hashCode是为对象生成一个哈希值(整数),这个值最常用的HashMap和HashSet中,而且对象是作为Key使用时才起作用。当然谁都不能保证每一个对象的hashCode都是唯一的,所以在Hash查找时,必须另外使用equals在一串hashCode相同的对象中查找真正的对应的Key。如果考虑到Hash过程即使不同的hashCode值也可能会被放到同一个链表中,这更需要equals了。

【2】元素放入集合时,不是所有集合都会检查hashCode值,只有运用了hash算法的集合,才会用到hashCode,比如HashSet,HashMap等,如果你往ArrayList里面添加元素,是不会用到hashCode的.

【3】如果一个对象equals另一个对象,那么他们的hashcode不一定相同,equals和hashcode两者之间没有必然的确定关系,这需要具体情况具体分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值