知识大全 java的hashtable的用法

Posted

篇首语:我自横刀向天笑,去留肝胆两昆仑。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 java的hashtable的用法相关的知识,希望对你有一定的参考价值。

  在main()中 每次产生一个随机数字 它都会封装到一个Integer对象里 使句柄能够随同散列表一起使用(不可对一个集合使用基本数据类型 只能使用对象句柄) containKey()方法检查这个键是否已经在集合里(也就是说 那个数字以前发现过吗?)若已在集合里 则get()方法获得那个键关联的值 此时是一个Counter(计数器)对象 计数器内的值i随后会增加 表明这个特定的随机数字又出现了一次

  假如键以前尚未发现过 那么方法put()仍然会在散列表内置入一个新的 键-值 对 在创建之初 Counter会自己的变量i自动初始化为 它标志着该随机数字的第一次出现

  为显示散列表 只需把它简单地打印出来即可 Hashtable toString()方法能遍历所有键-值对 并为每一对都调用toString() Integer toString()是事先定义好的 可看到计数器使用的toString 一次运行的结果(添加了一些换行)如下

  

   = = = = = = = = = = = = = = = = = = = =

  大家或许会对Counter类是否必要感到疑惑 它看起来似乎根本没有封装类Integer的功能 为什么不用int或Integer呢?事实上 由于所有集合能容纳的仅有对象句柄 所以根本不可以使用整数 学过集合后 封装类的概念对大家来说就可能更容易理解了 因为不可以将任何基本数据类型置入集合里 然而 我们对Java封装器能做的唯一事情就是将其初始化成一个特定的值 然后读取那个值 也就是说 一旦封装器对象已经创建 就没有办法改变一个值 这使得Integer封装器对解决我们的问题毫无意义 所以不得不创建一个新类 用它来满足自己的要求

   创建 关键 类在前面的例子里 我们用一个标准库的类(Integer)作为Hashtable的一个键使用 作为一个键 它能很好地工作 因为它已经具备正确运行的所有条件 但在使用散列表的时候 一旦我们创建自己的类作为键使用 就会遇到一个很常见的问题 例如 假设一套天气预报系统将Groundhog(土拔鼠)对象匹配成Prediction(预报) 这看起来非常直观 我们创建两个类 然后将Groundhog作为键使用 而将Prediction作为值使用 如下所示

  

  

  //: SpringDetector java// Looks plausible but doesn t work right import java util *;

  class Groundhog int ghNumber;Groundhog(int n) ghNumber = n;

  class Prediction boolean shadow = Math random() > ;public String toString() if(shadow)return Six more weeks of Winter! ;elsereturn Early Spring! ;

  public class SpringDetector public static void main(String[] args) Hashtable ht = new Hashtable();for(int i = ; i < ; i++)ht put(new Groundhog(i) new Prediction());System out println( ht = + ht + \\n );System out println( Looking up prediction for groundhog # : );Groundhog gh = new Groundhog( );if(ntainsKey(gh))System out println((Prediction)ht get(gh)); ///:~

  每个Groundhog都具有一个标识号码 所以赤了在散列表中查找一个Prediction 只需指示它 告诉我与Groundhog号码 相关的Prediction Prediction类包含了一个布尔值 用Math random()进行初始化 以及一个toString()为我们解释结果 在main()中 用Groundhog以及与它们相关的Prediction填充一个散列表 散列表被打印出来 以便我们看到它们确实已被填充 随后 用标识号码为 的一个Groundhog查找与Groundhog # 对应的预报

  看起来似乎非常简单 但实际是不可行的 问题在于Groundhog是从通用的Object根类继承的(若当初未指定基础类 则所有类最终都是从Object继承的) 事实上是用Object的hashCode()方法生成每个对象的散列码 而且默认情况下只使用它的对象的地址 所以 Groundhog( )的第一个实例并不会产生与Groundhog( )第二个实例相等的散列码 而我们用第二个实例进行检索

  大家或许认为此时要做的全部事情就是正确地覆蓋hashCode() 但这样做依然行不能 除非再做另一件事情 覆蓋也属于Object一部分的equals() 当散列表试图判断我们的键是否等于表内的某个键时 就会用到这个方法 同样地 默认的Object equals()只是简单地比较对象地址 所以一个Groundhog( )并不等于另一个Groundhog( )

    因此 为了在散列表中将自己的类作为键使用 必须同时覆蓋hashCode()和equals() 就象下面展示的那样

  

  //: SpringDetector java// If you create a class that s used as a key in// a Hashtable you must override hashCode()// and equals() import java util *;

  class Groundhog int ghNumber;Groundhog (int n) ghNumber = n; public int hashCode() return ghNumber; public boolean equals(Object o) return (o instanceof Groundhog )&& (ghNumber == ((Groundhog )o) ghNumber);

  public class SpringDetector public static void main(String[] args) Hashtable ht = new Hashtable();for(int i = ; i < ; i++)ht put(new Groundhog (i) new Prediction());System out println( ht = + ht + \\n );System out println( Looking up prediction for groundhog # : );Groundhog gh = new Groundhog ( );if(ntainsKey(gh))System out println((Prediction)ht get(gh)); ///:~

  注意这段代码使用了来自前一个例子的Prediction 所以SpringDetector java必须首先编译 否则就会在试图编译SpringDetector java时得到一个编译期错误

  Groundhog hashCode()将土拔鼠号码作为一个标识符返回(在这个例子中 程序员需要保证没有两个土拔鼠用同样的ID号码并存) 为了返回一个独一无二的标识符 并不需要hashCode() equals()方法必须能够严格判断两个对象是否相等

  equals()方法要进行两种检查 检查对象是否为null 若不为null 则继续检查是否为Groundhog 的一个实例(要用到instanceof关键字 第 章会详加论述) 即使为了继续执行equals() 它也应该是一个Groundhog 正如大家看到的那样 这种比较建立在实际ghNumber的基础上 这一次一旦我们运行程序 就会看到它终于产生了正确的输出(许多Java库的类都覆蓋了hashcode()和equals()方法 以便与自己提供的内容适应)

   属性 Hashtable的一种类型

  在本书的第一个例子中 我们使用了一个名为Properties(属性)的Hashtable类型 在那个例子中 下述程序行 Properties p = System getProperties() p list(System out) 调用了一个名为getProperties()的static方法 用于获得一个特殊的Properties对象 对系统的某些特征进行描述 list()属于Properties的一个方法 可将内容发给我们选择的任何流式输出 也有一个save()方法 可用它将属性列表写入一个文件 以便日后用load()方法读取

  尽管Properties类是从Hashtable继承的 但它也包含了一个散列表 用于容纳 默认 属性的列表 所以假如没有在主列表里找到一个属性 就会自动搜索默认属性

cha138/Article/program/Java/hx/201311/25719

相关参考

知识大全 HashTable类

HashTable类  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  //HashTable类表示

知识大全 哈希表(HashTable)

哈希表(HashTable)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  HashTable通

知识大全 hashTable和hashMap的不同

hashTable和hashMap的不同  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hash

知识大全 利用Session和HashTable制

利用Session和HashTable制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 在C#中应用哈希表(Hashtable)

在C#中应用哈希表(Hashtable)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一哈希表

知识大全 Hashtable Dictionary的使用

HashtableDictionary的使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  要了

知识大全 Java中7关于#的用法

Java中7关于#的用法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  你认识“#”么?让我猜猜

知识大全 Java中set的简单用法

Java中set的简单用法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Set的最大特点是能去

知识大全 Java中static用法简谈

Java中static用法简谈  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  请先看下面这段程序

知识大全 JAVA中mark()和reset()用法

JAVA中mark()和reset()用法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  <