很高兴能够和大家一起将《java就业教程》中的228页文字与代码学习。
首先Hashtable类放置的是一个Key-Value对,两者都要求是对象类型,然后明确一件事情:使用Hashtable提供的get(Object object)方法对Key对象进行检索,需要使用Key类的hasCode()和equals(Object object)方法,这与我上课时的说法没有出入。String类因为已经正确重写了Object类中的上述两个方法,所以当Key是String对象时不需要重写上述的方法。
接下来通过程序讲解,和我上课时提到的例子一样,注意标记代码
public class MyKey ... { private String name; private int age; public MyKey(String name, int age)...{ this.name = name; this.age = age; } public String toString()...{ String s = name + "," + age; return s; } public boolean equals(Object object)...{ MyKey mk = (MyKey)object; if(name.equals(mk.name) && age == mk.age)...{ return true; } else return false; } public int hashCode()...{ int i = name.hashCode() + age; return i; }}
上面这个类将用作Key,所以在其中重写equals(Object object)和hashCode().。重写的概念我们学习过,要求重写的方法和其父类方法完全一致,上课时我的问题就在这里,调试代码时将参数类表误写成 MyKey mk。显然这样在MyKey里就有两个方法名称都叫equals没有完成重写的要求。所以会出现问题。我们教材中229页的代码,也是有问题的,根本不能编译通过。原因也是equals的问题,请大家找出来。
将上面的代码改正之后,就可以使用下面这段程序来验证必须重写equals和hashCode的必要性了。标注部分会随着MyKey类中有无重写部分而得到不同的结果。请大家思考原因。最后向大家道歉,本应上课解决的问题现在才完成
import java.util. * ; public class TestHashtable ... { public static void main(String[] args) ...{ //产生存储人名和年龄的Hashtable 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)); numbers.put(new Pii(), new Integer(3)); System.out.println(numbers.get(new MyKey("zhangsan",18).toString())); } } }
马上就要过传统的新年了,作为游子的我已经一年整没有看到家人了,很想念他们。给他们也给各位同学拜个早年,大家身体健康,学习进步。