从object类中继承过来的equals()方法是对两个对象的地址值进行的比较(即比较引用是否相同)。默认从Object继承来的hashCode也是基于对象的地址值实现的。
public boolean equals(Object obj) {
return (this == obj);
}
要想弄清结构还是先看看Hashtable源代码中Object get(Object key)的实现:
public synchronized Object get(Object key) {
Entry tab[] = table;
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
for (Entry e = tab[index] ; e != null ; e = e.next) {
if ((e.hash == hash) && e.key.equals(key)) {
return e.value;
}
}
return null;
}}
可以看到是使用了key的hashcode和equals方法,来匹配查找的。
一般使用的时候会使用String,Integer,Double等类型来作为key,而这些类型中的hashcode和equals在JDK中已经重写,所以一般情况下可以不考虑重写equals和hashcode方法。至于value,只要是对象就可以了。
从上面的源代码也可以看到:如果重写了equals()方法,那么hashcode方法必须重写。
在我的排版系统中使用Hashtable后很多东西得到了简化(原来使用的对象数组,还得自己写find的代码,唉,C语言时代留下来的一些坏习惯看来得慢慢改呀!)
private Hashtable priorities;
if(sheet.get(i, j)==HAVE_TIME)
{
Priority temp=new Priority();
temp.setID(sheet.get(PERSON_ID_COL, i));
temp.addToPrior(sheet.get(i, j));//
priorities.put(new Double(temp.getID()), temp);
}