熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

java的hashtable的用法

2022-06-13   來源: Java核心技術 

  在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作為值使用如下所示

  

  

  //: SpringDetectorjava
// Looks plausible but doesnt work right
import javautil*;

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

  class Prediction {
boolean shadow = Mathrandom() > ;
public String toString() {
if(shadow)
return Six more weeks of Winter!;
else
return Early Spring!;
}
}

  public class SpringDetector {
public static void main(String[] args) {
Hashtable ht = new Hashtable();
for(int i = ; i < ; i++)
htput(new Groundhog(i) new Prediction());
Systemoutprintln(ht = + ht + \n);
Systemoutprintln(
Looking up prediction for groundhog #:);
Groundhog gh = new Groundhog();
if(ntainsKey(gh))
Systemoutprintln((Prediction)htget(gh));
}
} ///:~

  每個Groundhog都具有一個標識號碼所以赤了在散列表中查找一個Prediction只需指示它告訴我與Groundhog號碼相關的PredictionPrediction類包含了一個布爾值用Mathrandom()進行初始化以及一個toString()為我們解釋結果在main()中用Groundhog以及與它們相關的Prediction填充一個散列表散列表被打印出來以便我們看到它們確實已被填充隨後用標識號碼為的一個Groundhog查找與Groundhog #對應的預報

  看起來似乎非常簡單但實際是不可行的問題在於Groundhog是從通用的Object根類繼承的(若當初未指定基礎類則所有類最終都是從Object繼承的)事實上是用Object的hashCode()方法生成每個對象的散列碼而且默認情況下只使用它的對象的地址所以Groundhog()的第一個實例並不會產生與Groundhog()第二個實例相等的散列碼而我們用第二個實例進行檢索

  大家或許認為此時要做的全部事情就是正確地覆蓋hashCode()但這樣做依然行不能除非再做另一件事情覆蓋也屬於Object一部分的equals()當散列表試圖判斷我們的鍵是否等於表內的某個鍵時就會用到這個方法同樣地默認的Objectequals()只是簡單地比較對象地址所以一個Groundhog()並不等於另一個Groundhog(


    因此為了在散列表中將自己的類作為鍵使用必須同時覆蓋hashCode()和equals()就象下面展示的那樣

  

  //: SpringDetectorjava
// If you create a class thats used as a key in
// a Hashtable you must override hashCode()
// and equals()
import javautil*;

  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++)
htput(new Groundhog(i)new Prediction());
Systemoutprintln(ht = + ht + \n);
Systemoutprintln(
Looking up prediction for groundhog #:);
Groundhog gh = new Groundhog();
if(ntainsKey(gh))
Systemoutprintln((Prediction)htget(gh));
}
} ///:~

  注意這段代碼使用了來自前一個例子的Prediction所以SpringDetectorjava必須首先編譯否則就會在試圖編譯SpringDetectorjava時得到一個編譯期錯誤

  GroundhoghashCode()將土拔鼠號碼作為一個標識符返回(在這個例子中程序員需要保證沒有兩個土拔鼠用同樣的ID號碼並存)為了返回一個獨一無二的標識符並不需要hashCode()equals()方法必須能夠嚴格判斷兩個對象是否相等

  equals()方法要進行兩種檢查檢查對象是否為null若不為null則繼續檢查是否為Groundhog的一個實例(要用到instanceof關鍵字章會詳加論述)即使為了繼續執行equals()它也應該是一個Groundhog正如大家看到的那樣這種比較建立在實際ghNumber的基礎上這一次一旦我們運行程序就會看到它終於產生了正確的輸出(許多Java庫的類都覆蓋了hashcode()和equals()方法以便與自己提供的內容適應)

  屬性Hashtable的一種類型

  在本書的第一個例子中我們使用了一個名為Properties(屬性)的Hashtable類型在那個例子中下述程序行Properties p = SystemgetProperties()plist(Systemout)調用了一個名為getProperties()的static方法用於獲得一個特殊的Properties對象對系統的某些特征進行描述list()屬於Properties的一個方法可將內容發給我們選擇的任何流式輸出也有一個save()方法可用它將屬性列表寫入一個文件以便日後用load()方法讀取

  盡管Properties類是從Hashtable繼承的但它也包含了一個散列表用於容納默認屬性的列表所以假如沒有在主列表裡找到一個屬性就會自動搜索默認屬性

  Properties類亦可在我們的程序中使用(第章的ClassScannerjava便是一例)在Java庫的用戶文檔中往往可以找到更多更詳細的說明


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25719.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.