Hashtable类是存储键值对的类
常用函数有
put(关键字对象,值对象);//添加键值对,若添加的关键字已经存在,则会覆盖原来的值
get(关键字对象);//由关键字对象返回值对象
keys();返回所有的关键字对象,返回Enurmeration对象,使用方法见lesson6.5
注意:用作关键字的类必须覆盖Object.hashCode()方法和Object.equals方法。
习题:编写可用作Hashtable关键字的类并使用。
import java.util.Enumeration;
import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;
public class TestHashtable {
public static void main(String [] args)
{
Hashtable ht = new Hashtable();
ht.put(new MyKey("zhangsan", 15), new Integer(1));
ht.put(new MyKey("lisi", 20), new Integer(2));
ht.put(new MyKey("wangwu", 25), new Integer(3));
ht.put(new MyKey("zhaoliu", 30), new Integer(4));
Enumeration e = ht.keys();//返回所有关键字对象,配合Enumeration类使用
while(e.hasMoreElements())
{
MyKey mk = (MyKey)e.nextElement();
System.out.print(mk);//直接打印一个类对象,会自动调用toString方法,要覆盖该方法,否则是一串乱码
System.out.println("="+ht.get(mk));
}
System.out.println(new String("ax").hashCode()==new String("ax").hashCode());//这里只是实验相同字符串hashCode一样,String内容相同则占用同一块内存
}
}
//写一个可用作Hashtable关键字的类
class MyKey
{
String name;
int age;
MyKey(String name, int age)
{
this.name = name;
this.age = age;
}
//需要覆盖equals类和hashCode类,equals是判断两个对象内容是否相等,
//hashCode返回散列码,是有对象在内存中的地址转换而来的,也是用来判断对象是否相同的
public boolean equals(Object o)//这里的形参都是object,具体使用时还是要强制转换
{
if(o instanceof MyKey);//instanceof是一个运算符,用来判断对象是否属于某个类
{
MyKey mytmp = (MyKey)o;
if(mytmp.name.equals(this.name) && mytmp.age==this.age)
{
return true;
}
else
{
return false;
}
}
}
public int hashCode()
{
return name.hashCode()+age;//String类有hashCode方法,StringBuffer里没有哦!
}
public String toString()
{
return name+age;//为了打印时自动调用
}
}
有几个要注意的点:
String类有hashCode方法,直接调用就可以。
打印类对象会自动调用toString函数,可以按自己的要求覆盖打印想要的东西。