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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王虎 中级黑马   /  2012-10-11 10:17  /  2478 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

重写equal方法时为何通常也会重写hashCode,两者存在什么样的关系,equal则hashCode相同?反过来成立吗,为什么?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
如果保证元素的唯一性呢?
        A:首先根据hashCode值判断。
        B:如果hashCode值不同,那么,这就是不同的元素。直接存储。
        如果hashCode值相同,那么,会继续根据equals方法进行判断,
       根据自己的需求来决定元素是否相同。如果相同,就不存储。否则,存储。

        一般,用HashSet的时候,要重写hashCode和equals方法。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
方志亮 发表于 2012-10-11 10:45
如果保证元素的唯一性呢?
        A:首先根据hashCode值判断。
        B:如果hashCode值不同,那么,这就 ...

严重同意 楼上的
回复 使用道具 举报
首先 你要明白 hashCode  equals  分别有啥作用??
1,hashCode是计算哈希值的,你想想  能用到哈希值的不就是 对象的地址值嘛!!当地址值确定了 那么这个对象就确定了!
   如果有其他对象用的也是这个地址值  问题如下....
2,  继续,既然地址值一样了。跟你说 ,自然情况下 非人为的,堆内存中是绝对不可能有两个或以上对象用同一个地址值!!
   这个时候我们就想了,如果我们人为的把所有对象强行的公用一个地址值。
   这时候又出现问题了!!那我们如何知道这些对象具体内容到底是不是一样的呢??
3,这个时候我们就该覆写equals方法来具体判断一哈每两个对象具体内容是否完全一样。
   如果内容一样,虚拟机自动识别,会认为两个对象是一样的即是同一个对象;
   如果内容不一样,虚拟机自动识别  为认为这是两个不同的对象。


一般 也就在hasSet 以及hashMap 中会用到。。。。。因为底层数据要求对象不重复也就是存储的元素不能重复。。。
祝愉快。。。。。
回复 使用道具 举报
在使用HashSet集合的时候必须得重写hashCode与equals方法,而在没有使用HashSet的情况下并不需要重写hashCode与equals方法。一般情况下,许多人都选择重写hashCode与equals方法,因为在以后用到HashSet集合的时候方便使用。就算不用,反正添加上也没有错。
hashCode方法,就是计算哈希值的
equals在Object中是比较哈希值是否相等,而重写之后,就会判断内容。
在使用HashSet的情况下,当添加一个对象到集合中,会先计算这个对象的哈希值,然后与这个集合中所有对象的哈希值比较(类似这样,其实计算哈希值比较繁琐)用hashCode()。如果没有相同的,就直接添加到集合中。如果有相同的,就判断equals( )返回值。如果是false,就将这个对象放在与HashSet集合中,与这个对象HashCode值相同的地方,链接起来,相当于这个地方有两个对象。如果判断equals( )返回的值时true,那么这个对象就不能添加到HashSet集合中。
回复 使用道具 举报
hashCode是编译器为不同对象产生的不同整数,根据equal方法的定义:如果两个对象是相等(equal)的,那么两个对象调用hashCode必须产生相同的整数结果,即:equal为true,hashCode必须为true,equal为false,hashCode也必须为false,所以必须重写hashCode来保证与equal同步。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马