一个关于hashCode()和equals()的问题!!! 请问hashCode(),equals()这个两个方法是做什么用的,hashCode()不是得到一个对象的哈希值来确定他的存取位置吗,那还要equals()做什么呢,那这个两个方法,调用顺序是:集合hashCode->对象类型hashCode->集合equals->对象类型equals的顺序.那插入相同对象是什么样子,插入不同对象又是什么样子呢?谢谢各位了!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有一个概念要牢记,两个相等对象的equals方法一定为true, 但两个hashcode相等的对象不一定是相等的对象。所以hashcode相等只能保证两个对象在一个HASH表里的同一条HASH链上,继而通过equals方法才能确定是不是同一对象,如果结果为true, 则认为是同一对象不在插入,否则认为是不同对象继续插入。 http://blog.csdn.net/fishyqd/archive/2006/08/17/1086641.aspx 严格地说,hashcode用于确定散列桶的起始地址而不是对象地址,确切的存储地址和当前哈希表的状态以及冲突检测函数都有关系。以一个hashtable为例,两个equal的对象,hashcode不等。其中一个当key插入,用另一个查询。结果如何?其实结果是不确定的,和hashtable的实现有关。大部分的情况下,应该是返回null。因为程序将试图到另一个散列桶去寻找。只有在最极端的情况下,比如使用线性散列冲突函数(+n)且n不小于当前哈希表大小,这时候哈希表退化成链表,是可以找到的。java的hashtable的查询的工作原理:首先根据key的hashcode()返回值定位到一个散列桶。再根据equal方法判断是否存在(于该散列桶)。再,根据我的观察,1.4.2版本中它不会退化成链表。 java的hashtable的查询的工作原理:首先根据key的hashcode()返回值定位到一个散列桶。再根据equal方法判断是否存在(于该散列桶)。再,根据我的观察,1.4.2版本中它不会退化成链表。这个话误人子弟了我补充的准确些:hashcode定位到散列码桶的意义,只是确定了这个元素属于哪条链表,紧接着不是根据equals方法判断是否存在,而是仍旧判断当前的hashcode是否存在,然后再判断equals方法。因为在已确定的那条链表里可能混有其它不同的hashcode,至于原因,是因为由hashcode确定链表的方式决定的,实际实现时不可能为了每个hashcode分配一条hash链表。当然理论上能这样最好。细节请查看源码。至于说退化成链表的问题,如果某个元素的hashcode为常数,那就已经退化成链表了。 有道理,再补充一下如果两个对象equals的话,那么它们的hashcode肯定是相等的但是hashcode相等的对 方法重载问题,参数类型int,float可以构成重载吗? java 如何释放处于wait的对象? 父类和子类的方法 初学Java,心里有很多问题想请教 JFileChooser的问题 如何将JCheckBoxMenuItem控件前的小方框去掉! Socket的测试程序,本地echo端口怎么连接不上呢? 请问,Java学到什么程度就能开发手机软件了? jdk和jbuider是什么关系,jbuider如何用 求助一个素数乘法竖式的软件题目 串口收发信息操作,反馈信息的干扰 java 的内部类/匿名内部类 都是怎么回事!!请用程序说明问题
其实结果是不确定的,和hashtable的实现有关。
大部分的情况下,应该是返回null。因为程序将试图到另一个散列桶去寻找。只有在最极端的情况下,比如使用线性散列冲突函数(+n)且n不小于当前哈希表大小,这时候哈希表退化成链表,是可以找到的。java的hashtable的查询的工作原理:首先根据key的hashcode()返回值定位到一个散列桶。再根据equal方法判断是否存在(于该散列桶)。
再,根据我的观察,1.4.2版本中它不会退化成链表。
再,根据我的观察,1.4.2版本中它不会退化成链表。这个话误人子弟了
我补充的准确些:hashcode定位到散列码桶的意义,只是确定了这个元素属于哪条链表,紧接着不是根据equals方法判断是否存在,而是仍旧判断当前的hashcode是否存在,然后再判断equals方法。因为在已确定的那条链表里可能混有其它不同的hashcode,至于原因,是因为由hashcode确定链表的方式决定的,实际实现时不可能为了每个hashcode分配一条hash链表。当然理论上能这样最好。细节请查看源码。
至于说退化成链表的问题,如果某个元素的hashcode为常数,那就已经退化成链表了。
如果两个对象equals的话,那么它们的hashcode肯定是相等的
但是hashcode相等的对