免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1475 | 回复: 0
打印 上一主题 下一主题

java中使用Hashtable定义自己的关键类 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-07-21 13:44 |只看该作者 |倒序浏览

java中使用Hashtable定义自己的关键类,主要是有关集合映射的问题,通过一个key在集合中寻找对应的value 对象,其中key被称为"关键类",
使用Hashtable 的put(Object key ,Object value) 方法将对象存入到Hashtable中,然后通过get(Object key )寻找key对应的value 对象。
(以下具体内容摘录)
[color="#009900"]//: SpringDetector.java
[color="#009900"]// Looks plausible, but doesn't work right.
[color="#0000ff"]import java.util.*;
[color="#0000ff"]class Groundhog {
  [color="#0000ff"]int ghNumber;
  Groundhog([color="#0000ff"]int n) { ghNumber = n; }
}
[color="#0000ff"]class Prediction {
  [color="#0000ff"]boolean shadow = Math.random() > 0.5;
  [color="#0000ff"]public String toString() {
    [color="#0000ff"]if(shadow)
      [color="#0000ff"]return [color="#004488"]"Six more weeks of Winter!";
    [color="#0000ff"]else
      [color="#0000ff"]return [color="#004488"]"Early Spring!";
  }
}
[color="#0000ff"]public [color="#0000ff"]class SpringDetector {
  [color="#0000ff"]public [color="#0000ff"]static [color="#0000ff"]void main(String[] args) {
    Hashtable ht = [color="#0000ff"]new Hashtable();
    [color="#0000ff"]for([color="#0000ff"]int i = 0; i "
");
    System.out.println(
      [color="#004488"]"Looking up prediction for groundhog #3:");
    Groundhog gh = [color="#0000ff"]new Groundhog(3);
    [color="#0000ff"]if(ht.containsKey(gh))
      System.out.println((Prediction)ht.get(gh));
  }
} [color="#009900"]///:~
每个Groundhog都具有一个标识号码,所以赤了在散列表中查找一个Prediction,只需指示它“告诉我与Groundhog号码3相关的Prediction”。Prediction类包含了一个布尔值,用Math.random()进行初始化,以及一个toString()为我们解释结果。在main()中,用Groundhog以及与它们相关的Prediction填充一个散列表。散列表被打印出来,以便我们看到它们确实已被填充。随后,用标识号码为3的一个Groundhog查找与Groundhog #3对应的预报。
看起来似乎非常简单,但实际是不可行的。问题在于Groundhog是从通用的Object根类继承的(若当初未指定基础类,则所有类最终都是从Object继承的)。事实上是用Object的hashCode()方法生成每个对象的散列码,而且默认情况下只使用它的对象的地址。所以,Groundhog(3)的第一个实例并不会产生与Groundhog(3)第二个实例相等的散列码,而我们用第二个实例进行检索。
大家或许认为此时要做的全部事情就是正确地覆盖hashCode()。但这样做依然行不能,除非再做另一件事情:覆盖也属于Object一部分的equals()。当散列表试图判断我们的键是否等于表内的某个键时,就会用到这个方法。同样地,默认的Object.equals()只是简单地比较对象地址,所以一个Groundhog(3)并不等于另一个Groundhog(3)。
因此,为了在散列表中将自己的类作为键使用,必须同时覆盖hashCode()和equals(),就象下面展示的那样:
[color="#009900"]//: SpringDetector2.java
[color="#009900"]// If you create a class that's used as a key in
[color="#009900"]// a Hashtable, you must override hashCode()
[color="#009900"]// and equals().
[color="#0000ff"]import java.util.*;
[color="#0000ff"]class Groundhog2 {
  [color="#0000ff"]int ghNumber;
  Groundhog2([color="#0000ff"]int n) { ghNumber = n; }
  [color="#0000ff"]public [color="#0000ff"]int hashCode() { [color="#0000ff"]return ghNumber; }
  [color="#0000ff"]public [color="#0000ff"]boolean equals(Object o) {
    [color="#0000ff"]return (o [color="#0000ff"]instanceof Groundhog2)
      && (ghNumber == ((Groundhog2)o).ghNumber);
  }
}
[color="#0000ff"]public [color="#0000ff"]class SpringDetector2 {
  [color="#0000ff"]public [color="#0000ff"]static [color="#0000ff"]void main(String[] args) {
    Hashtable ht = [color="#0000ff"]new Hashtable();
    [color="#0000ff"]for([color="#0000ff"]int i = 0; i "
");
    System.out.println(
      [color="#004488"]"Looking up prediction for groundhog #3:");
    Groundhog2 gh = [color="#0000ff"]new Groundhog2(3);
    [color="#0000ff"]if(ht.containsKey(gh))
      System.out.println((Prediction)ht.get(gh));
  }
} [color="#009900"]///:~

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/1507/showart_36903.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP