《java培训教程》229页代码有问题,兼谈Hashtable需要注意之处

    技术2022-05-11  75

       很高兴能够和大家一起将《java就业教程》中的228页文字与代码学习。

        首先Hashtable类放置的是一个KeyValue对,两者都要求是对象类型,然后明确一件事情:使用Hashtable提供的getObject object)方法对Key对象进行检索,需要使用Key类的hasCode()equals(Object object)方法,这与我上课时的说法没有出入。String类因为已经正确重写了Object类中的上述两个方法,所以当KeyString对象时不需要重写上述的方法。

    接下来通过程序讲解,和我上课时提到的例子一样,注意标记代码

     

    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的问题,请大家找出来。

    将上面的代码改正之后,就可以使用下面这段程序来验证必须重写equalshashCode的必要性了。标注部分会随着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()));    }  } }

        马上就要过传统的新年了,作为游子的我已经一年整没有看到家人了,很想念他们。给他们也给各位同学拜个早年,大家身体健康,学习进步。


    最新回复(0)