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

 

   很高兴能够和大家一起将《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()));

    }


  }


}

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值