请问hashCode(),equals()这个两个方法是做什么用的,hashCode()不是得到一个对象的哈希值来确定他的存取位置吗,那还要equals()做什么呢,那这个两个方法,调用顺序是:集合hashCode->对象类型hashCode->集合equals->对象类型equals的顺序.那插入相同对象是什么样子,插入不同对象又是什么样子呢?
谢谢各位了!!

解决方案 »

  1.   

    有一个概念要牢记,两个相等对象的equals方法一定为true, 但两个hashcode相等的对象不一定是相等的对象。所以hashcode相等只能保证两个对象在一个HASH表里的同一条HASH链上,继而通过equals方法才能确定是不是同一对象,如果结果为true, 则认为是同一对象不在插入,否则认为是不同对象继续插入。
      

  2.   

    http://blog.csdn.net/fishyqd/archive/2006/08/17/1086641.aspx
      

  3.   

    严格地说,hashcode用于确定散列桶的起始地址而不是对象地址,确切的存储地址和当前哈希表的状态以及冲突检测函数都有关系。以一个hashtable为例,两个equal的对象,hashcode不等。其中一个当key插入,用另一个查询。结果如何?
    其实结果是不确定的,和hashtable的实现有关。
    大部分的情况下,应该是返回null。因为程序将试图到另一个散列桶去寻找。只有在最极端的情况下,比如使用线性散列冲突函数(+n)且n不小于当前哈希表大小,这时候哈希表退化成链表,是可以找到的。java的hashtable的查询的工作原理:首先根据key的hashcode()返回值定位到一个散列桶。再根据equal方法判断是否存在(于该散列桶)。
    再,根据我的观察,1.4.2版本中它不会退化成链表。
      

  4.   

    java的hashtable的查询的工作原理:首先根据key的hashcode()返回值定位到一个散列桶。再根据equal方法判断是否存在(于该散列桶)。
    再,根据我的观察,1.4.2版本中它不会退化成链表。这个话误人子弟了
    我补充的准确些:hashcode定位到散列码桶的意义,只是确定了这个元素属于哪条链表,紧接着不是根据equals方法判断是否存在,而是仍旧判断当前的hashcode是否存在,然后再判断equals方法。因为在已确定的那条链表里可能混有其它不同的hashcode,至于原因,是因为由hashcode确定链表的方式决定的,实际实现时不可能为了每个hashcode分配一条hash链表。当然理论上能这样最好。细节请查看源码。
    至于说退化成链表的问题,如果某个元素的hashcode为常数,那就已经退化成链表了。
      

  5.   

    有道理,再补充一下
    如果两个对象equals的话,那么它们的hashcode肯定是相等的
    但是hashcode相等的对