十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!
创新互联基于成都重庆香港及美国等地区分布式IDC机房数据中心构建的电信大带宽,联通大带宽,移动大带宽,多线BGP大带宽租用,是为众多客户提供专业服务器托管报价,主机托管价格性价比高,为金融证券行业雅安服务器托管,ai人工智能服务器托管提供bgp线路100M独享,G口带宽及机柜租用的专业成都idc公司。java中重写equals和重写hashCode()
记得在刚上初一的时候,第一堂数学课学的是集合,那时候我知道了集合是不允许重复元素存在的。
hashCode 方法用于散列集合的查找,equals 方法用于判断两个对象是否相等。
为什么重写了 equals 方法,还要重写 hashCode 方法?
因为如果只重写了 equals 方法,两个对象 equals 返回了true,但是如果没有重写 hashCode 方法,集合还是会插入元素。这样集合中就出现了重复元素了。
接下来详细分析,以 HashMap 的 put 方法:
public V put(K key, V value) { if (key == null) return putForNullKey(value); //通过key的hashcode计算hash值 int hash = hash(key.hashCode()); //通过hash值和table数组的长度计算出元素存放在table数组的位置 int i = indexFor(hash, table.length); //table[i]的位置已经存在元素,遍历链表 for (Entrye = table[i]; e != null; e = e.next) { Object k; //调用 equals 方法判断key是否相等,若相等,该key对应的键值对已经存在,用新的value取代旧的value if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; // 若该key对应的键值对不存在,将key-value封装成Entry对象添加到table[i]处 ,头插法。 addEntry(hash, key, value, i); return null; }