就比如下面这个程序:
import java.util.*;
public class HashtableTest
{
public static void main(String []args)
{
Hashtable numbers=new Hashtable();
numbers.put(new MyKey("zhangsan",18),new Integer(1));
numbers.put(new MyKey("Lisi",15),new Integer(2));
numbers.put(new MyKey("Wangwu",20),new Integer(3));
Enumeration e=numbers.keys();
while(e.hasMoreElements())
{
MyKey key=(MyKey)e.nextElement();
System.out.print(key.toString()+"=");
System.out.println(numbers.get(key).toString());
}
}
}class MyKey
{
private String name;
private int age;
public MyKey(String name,int age)
{
this.name=name;
this.age=age;
}
public String toString()
{
return new String(name+","+age);
}
public boolean equals(Object obj)
{
MyKey m=(MyKey)obj;
if(name.equals(m.name)&& age==m.age)
return true;
else
return false;
}
public int hashCode()
{
return name.hashCode()+age;//就是这里,为什么要+age??
}
}谢谢!

解决方案 »

  1.   

    这种实现肯定并不是一个好的方式。
    名字相同基本上可以认为是同一个人,以age来区别不是很好
    即使使用两者来区别,hashCode的实现仍然不是很好
      

  2.   

    hashCode() 要遵循 equals()为真时 hashCode()要相等任何时候一个对象的hashCode()都返回同样的值
      

  3.   

    因为要覆盖hashcode方法,所以希望在name和age相同的时候,hashcode方法能够返回相同的值
    因此,这里就用的是name+age
      

  4.   

    那要看到底有没有可能是同一个名字对应不同的人,其实如果重名的概率低的话的确不必要加age其实你怎么写都没有所谓,只要你认为是相同的MyKey对象所返回的hashCode相同就行
    即a.equals(b) == true必有a.hashCode() == b.hashCode();反之则不一定成立,但是你应该尽可能的降低a.hashCode() == b.hashCode() 但 a.equals(b) == false的情况(这个情况是无可避免的)。