A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

明白equals()方法用来比较类的对象是否相等,hasCode()是获得哈希值 就是不太明白他俩为啥要一起覆写呢 ?

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

6 个回复

倒序浏览
其实你可以不重写hashCode方法
比较两个对象是否相同时,首先比较哈希值,由哈希算法得到,如果没有重写hashCode方法的话,会调用父类Object的hashCode方法,当然你也可以重写hashCode方法,指定自己的哈希算法,如果哈希值不同,两个对象一定不同,直接返回false,如果相同则调用equals方法进行比较,要重写equals方法,各个属性都相同则返回true,反之则返回false。
对象建立以后会根据哈希值放入哈希表中,哈希值相同的会在后面建立链表一一存放,比较对象时直接查找哈希表,哈希值相同才会调用equals方法,不是每个都去调用equals方法,这样效率相对提高了,这就是为什么我们重写hashCode的原因

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
首先你要知道hashCode()方法的作用:
    如果想查找一个集合中是否包含有某个对象,你通常是逐一取出每个元素与要查找的对象进行比较,当发现某个元素与要查找的对象进行equals方法比较的结果相等时,则停止继续查找并返回肯定的信息,否则,返回否定的信息。如果一个集合中有很多个元素,譬如有一万个元素,并且没有包含要查找的对象时,则意味着你的程序需要从该集合中取出一万个元素进行逐一比较才能得到结论。所以有人发明了一种哈希算法来提高从集合中查找元素的效率。
        这种方式是将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储在哪个区域。
        HashSet就是采用哈希算法存取对象的集合,它内部采用对某个数字n进行取余的方式对哈希码进行分组和划分对象的存储区域,Object类中定义了一个hashCode()方法来返回每个Java对象的哈希码,当从HashSet集合中查找某个对象时,Java系统首先调用对象的hashCode()方法获得该对象的哈希码,然后根据哈希码找到相应的存储区域,最后取出该存储区域内的每个元素与该对象进行equals方法比较,这样不用遍历集合中的所有元素就可以得到结论。
    总之,hashcode的好处就是能提高效率,像楼上说的你也可以不重写,它自动会去调用Object类中的。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
在add(对象时)重写hashCode()方法是为了提高效率,不重写会调用父类的Object中的hashCode(),
HashSet集合添加元素时会比较哈希值再使用equals比较对象的值:
          当一个元素进来时,会与集合内部进行哈希值比较,如果无相同,不调用equals,则添加并返回true(表示添加),
        如果与集合内部元素有相同哈希值,则使用equals方法,进行比较,比较得出true,相同,则不添加并方法false(表示不添加)。
而equals重写,原Object的equals方法比较的是地址,重写后比较对象的值        。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
重不重写hashcode方法,看你怎么用了,如果你想用哈希集合来存储自定义对象的话,而其中对象的内容又有相同时,就有必要重写object的hashcode()方法了,它主要是用来比较对象的哈希值是否相等的,如果相等就会在调用父类的equals()方法来比较存进来的对象的内容是否相等。如果不用hashcode方法,只用equal方法的话,那么是无法保证存入集合中元素的唯一性的。
如果元素的hashcode值相同,才会判断equals是否为true;
如果元素的hashcode值不同,就不用判断equals是否为true;由此可以看出自定义类中调用hashcode方法效率更高。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
    equals()和HashCode()之间没有必然的联系。正如楼主理解的,equals()方法用来比较类的对象是否相等,hasCode()是获得哈希值 !
    就好比一个是轮子,一个是汽油的关系。
    轮子单独用是自行车,equals()单独用比较String对象是否相等,源码在String.class中。
    汽油单独用是打火机,HashCode(),哈希值通过如下运算 h = 31*h + val[off++](源码在String.class)得到。
    轮子和汽油组合用就是汽车,用于set集合中。set集合中的元素有两个特点,无序、不重复。怎样保证不重复?
        首先 将要加入set中的对象A 与 已经存在在set中的对象B..Z的hash值进行相比较,若不等,将A加入set中,若相等怎么办?这个时候equals就派上了用场,通过默认或者重写的equals()进行对比判断。若还相等,A对象就真的和set集合说拜拜了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马