利用Hashtable类检索数据覆盖hashCode()方法时,要遵循什么规律?就比如这个程序,为什么+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??
}
}
谢谢!
问题点数:10、回复次数:4Top
1 楼treeroot(旗鲁特)回复于 2006-03-02 09:05:45 得分 0
这种实现肯定并不是一个好的方式。
名字相同基本上可以认为是同一个人,以age来区别不是很好
即使使用两者来区别,hashCode的实现仍然不是很好Top
2 楼interpb(曾曾胡,深怕情多累美人!)回复于 2006-03-02 09:48:46 得分 0
hashCode() 要遵循 equals()为真时 hashCode()要相等
任何时候一个对象的hashCode()都返回同样的值
Top
3 楼hljaae(酒独倾)回复于 2006-03-02 11:39:54 得分 0
因为要覆盖hashcode方法,所以希望在name和age相同的时候,hashcode方法能够返回相同的值
因此,这里就用的是name+ageTop
4 楼ChDw(米)回复于 2006-03-02 11:45:42 得分 0
那要看到底有没有可能是同一个名字对应不同的人,其实如果重名的概率低的话的确不必要加age
其实你怎么写都没有所谓,只要你认为是相同的MyKey对象所返回的hashCode相同就行
即a.equals(b) == true必有a.hashCode() == b.hashCode();
反之则不一定成立,但是你应该尽可能的降低a.hashCode() == b.hashCode() 但 a.equals(b) == false的情况(这个情况是无可避免的)。Top




