zoukankan      html  css  js  c++  java
  • 为什么java中的对象类中重写equals方法一定还要重写hashcode方法

    首先默认对象继承object,object中equals比较的是对象的内存地址信息,hashcode比较的是对象的内存地址经过hash计算后的hash值。如过是我们需要判断两个对象的内存是否相等的时候,一般不涉及hash类型集合时不用重写hashcode方法,equals就够了,但是涉及到HashMap、HashSet和Hashtable 的时候为了提高存储查询效率会用到hashcode方法,这个时候如果hashcode不重写就会违反我们关于hashcode的约定。

    以下是关于hashcode的一些规定:

    两个对象相等,hashcode一定相等

    两个对象不等,hashcode不一定不等

    hashcode相等,两个对象不一定相等

    hashcode不等,两个对象一定不等

    覆盖equals时总要覆盖hashCode 的原因:
      一个很常见的错误根源在于没有覆盖hashCode方法。在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常运作,这样的集合包括HashMap、HashSet和Hashtable。

    比如将两个对象存入HashSet里面:如果不重写hashCode,还用原来的hashCode就可能判断两个对象的hashCode不相等(其实重写hashCode再判断这两个对象才发现这两个对象的hashCode是相等的),然后因为判断这两个对象的hashCode不相等就会直接将这两个对象存入HashSet,这就导致了实际上存入了这两个相同的对象。
    ————————————————
    转自:https://blog.csdn.net/yrsg666/java/article/details/93621124

    诸位正值青春年少,一定恣情放纵,贪恋香艳梅施之情,喜欢风流雅韵之事,洒脱木拘。然而诸位可知,草上露一碰即落,竹上霜一触即溶,此种风情难于长久。
  • 相关阅读:
    poj 2425 AChessGame(博弈)
    poj2975 Nim 胜利的方案数
    hdu 5724 SG+状态压缩
    hdu 5274 Dylans loves tree(LCA + 线段树)
    hdu 5266 pog loves szh III(lca + 线段树)
    hdu 4031 attack 线段树区间更新
    51 nod 1188 最大公约数之和 V2
    51nod 1040 最大公约数之和(欧拉函数)
    51nod 1035:最长的循环节
    Nim游戏(组合游戏Combinatorial Games)
  • 原文地址:https://www.cnblogs.com/shilipojianshen/p/13023201.html
Copyright © 2011-2022 走看看