黑马程序员技术交流社区
标题:
equal与hashCode的重写问题?
[打印本页]
作者:
王虎
时间:
2012-10-11 10:17
标题:
equal与hashCode的重写问题?
重写equal方法时为何通常也会重写hashCode,两者存在什么样的关系,equal则hashCode相同?反过来成立吗,为什么?
作者:
方志亮
时间:
2012-10-11 10:45
如果保证元素的唯一性呢?
A:首先根据hashCode值判断。
B:如果hashCode值不同,那么,这就是不同的元素。直接存储。
如果hashCode值相同,那么,会继续根据equals方法进行判断,
根据自己的需求来决定元素是否相同。如果相同,就不存储。否则,存储。
一般,用HashSet的时候,要重写hashCode和equals方法。
作者:
杨华东
时间:
2012-10-11 10:51
方志亮 发表于 2012-10-11 10:45
如果保证元素的唯一性呢?
A:首先根据hashCode值判断。
B:如果hashCode值不同,那么,这就 ...
严重同意 楼上的
作者:
杨华东
时间:
2012-10-11 11:12
首先 你要明白 hashCode equals 分别有啥作用??
1,hashCode是计算哈希值的,你想想 能用到哈希值的不就是 对象的地址值嘛!!当地址值确定了 那么这个对象就确定了!
如果有其他对象用的也是这个地址值 问题如下....
2, 继续,既然地址值一样了。跟你说 ,自然情况下 非人为的,堆内存中是绝对不可能有两个或以上对象用同一个地址值!!
这个时候我们就想了,如果我们人为的把所有对象强行的公用一个地址值。
这时候又出现问题了!!那我们如何知道这些对象具体内容到底是不是一样的呢??
3,这个时候我们就该覆写equals方法来具体判断一哈每两个对象具体内容是否完全一样。
如果内容一样,虚拟机自动识别,会认为两个对象是一样的即是同一个对象;
如果内容不一样,虚拟机自动识别 为认为这是两个不同的对象。
一般 也就在hasSet 以及hashMap 中会用到。。。。。因为底层数据要求对象不重复也就是存储的元素不能重复。。。
祝愉快。。。。。
作者:
张忠豹
时间:
2012-10-11 11:45
在使用HashSet集合的时候必须得重写hashCode与equals方法,而在没有使用HashSet的情况下并不需要重写hashCode与equals方法。一般情况下,许多人都选择重写hashCode与equals方法,因为在以后用到HashSet集合的时候方便使用。就算不用,反正添加上也没有错。
hashCode方法,就是计算哈希值的
equals在Object中是比较哈希值是否相等,而重写之后,就会判断内容。
在使用HashSet的情况下,当添加一个对象到集合中,会先计算这个对象的哈希值,然后与这个集合中所有对象的哈希值比较(类似这样,其实计算哈希值比较繁琐)用hashCode()。如果没有相同的,就直接添加到集合中。如果有相同的,就判断equals( )返回值。如果是false,就将这个对象放在与HashSet集合中,与这个对象HashCode值相同的地方,链接起来,相当于这个地方有两个对象。如果判断equals( )返回的值时true,那么这个对象就不能添加到HashSet集合中。
作者:
戴进飘
时间:
2012-10-11 12:23
hashCode是编译器为不同对象产生的不同整数,根据equal方法的定义:如果两个对象是相等(equal)的,那么两个对象调用hashCode必须产生相同的整数结果,即:equal为true,hashCode必须为true,equal为false,hashCode也必须为false,所以必须重写hashCode来保证与equal同步。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2