黑马程序员技术交流社区
标题:
关于equals()方法和hashCode()方法问题
[打印本页]
作者:
悠然丶
时间:
2014-4-19 21:58
标题:
关于equals()方法和hashCode()方法问题
本帖最后由 悠然丶 于 2014-4-20 18:01 编辑
在书上看到这个题; 为什么在重写了equals()方法之后也必须重写hashCode()方法?
这个我也答不上来,求解!
作者:
王峰峰
时间:
2014-4-19 22:05
1、equals方法用于比较对象的内容是否相等(覆盖以后);
2、hashcode方法只有在集合中用到;
3、当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)。
4、将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。
作者:
caijunsong
时间:
2014-4-19 22:33
只要一个集合底层是通过哈希算法给元素指定内存位置,那么就必须复写以上两个方法
HashSet和HashMap底层都是通过哈希算法分配内存,又这两个集合元素是不可重复 无序的
那么我们怎么定义不可重复了?哈希地址 或者内容 因为会出现以下几种状况
1 哈希值相同 但是内容不同 是可以插入的 只是在这两个元素是以链表的形式存在
2 哈希值相同 但是内容也相同 都相同 当然是不允许插入的啦
3 哈希值不同 分配的内存位置肯定不同(哈希值其实就是内存的地址的一个十六进制表示)
,内容相同与否都是可以插入集合之中的
以上除了2 之外都是能插入元素的情况
我们要做的就是保证一个哈希地址值存放一个元素,1是可以存在,但是它的访问效率低,所以就不推荐这么干
,因此我们遵循的原则是 内容如果不同,保证哈希值也不同,不就可以实现我们的唯一地址唯一内容的目的了吗
,你会想上面那句话倒着说成立不,你再想如果哈希值不同了,还有比较内容的必要吗 肯定都能插入
作者:
悠然丶
时间:
2014-4-19 23:41
caijunsong 发表于 2014-4-19 22:33
只要一个集合底层是通过哈希算法给元素指定内存位置,那么就必须复写以上两个方法
HashSet和HashMap底层都 ...
恩 很详细,谢了
作者:
也许依然
时间:
2014-4-20 11:19
class Demo{
public static void main(String[] args){
HashSet<String> hSet = new HashSet<String>();
hSet.add("zxx");
hSet.add("lhm");
hSet.add("flx");
Iterator<String> iterator = hSet.iterator();
while(iterator.hasNext()){
String name = iterator.next();
System.out.println(name);
}
}
}
复制代码
HashSet和HashMap中,底层的数据结构是哈希表,元素存储是按哈希表中对应的值在集合中存储
哈希值为根据哈希函数计算得到的元素在内存中的地址值,因为不可以存储相同的元素,在添加元素时需要判断
因为计算出来的元素的哈希值有可能相同,所以还需要复写equals方法,判断元素的内容是否相同
存入元素时要先判断hashCode方法的值
如果元素的HashCode值相同,才会判断equals是否为true
如果元素的hashcode值不同,不会调用equals
作者:
微笑=.一瞬间
时间:
2014-4-20 14:49
如果两个元素的hashcode不相同,那么肯定是不同的元素;如果两个元素的hashcode相同,那么不一定两个是不同的元素。两个不同的元素可能计算出来的hashcode是相同的。hash的作用在于快速检索,而不是单纯地为了判断对象的相等。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2