就比如下面这个程序:
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??
}
}谢谢!
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??
}
}谢谢!
名字相同基本上可以认为是同一个人,以age来区别不是很好
即使使用两者来区别,hashCode的实现仍然不是很好
因此,这里就用的是name+age
即a.equals(b) == true必有a.hashCode() == b.hashCode();反之则不一定成立,但是你应该尽可能的降低a.hashCode() == b.hashCode() 但 a.equals(b) == false的情况(这个情况是无可避免的)。