資源描述:
《java中的hashtable的實(shí)例講解》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、java中的hashtable的實(shí)例講解f91Java中的Hashtable的用法:Java包含兩個類,java.util.Hashtable和java.util.HashMap,它們提供了一個多種用途的hashtable機(jī)制。Hashtable和HashMap對象可以讓你把一個key和一個value結(jié)合起來,并用put()方法把這對key/value輸入到表中。然后你可以通過調(diào)用get()方法,把key作為參數(shù)來得到這個value(值)。只要滿足兩個基本的要求,key和value可以是任何對象
2、。注意,因?yàn)閗ey和value必須是對象,所以原始類型(primitivetypes)必須通過運(yùn)用諸如Integer(int)的方法轉(zhuǎn)換成對象。下面是一段簡單的示例代碼:1.先創(chuàng)建一個hashtable,保存了1,2,3三個對象。Hashtablenumbers=newHashtable();numbers.put("one",newInteger(1));numbers.put("two",newInteger(2));numbers.put("three",newInteger(3));2.
3、查找Integern=(Integer)numbers.get("two");if(n!=null){System.out.println("two="+n);}為了將一個特定類的對象用做一個key,這個類必須提供兩個方法,equals()和hashCode()。這兩個方法在java.lang.Object中,所以所有的類都可以繼承這兩個方法;但是,這兩個方法在Object類中的實(shí)現(xiàn)一般沒什么用,所以你通常需要自己重載這兩個方法。Equals()方法把它的對象同另一個對象進(jìn)行比較,如果這兩個對象
4、代表相同的信息,則返回true。該方法也查看并確保這兩個對象屬于相同的類。如果兩個參照對象是完全一樣的對象,Object.equals()返回true,這就說明了為什么這個方法通常不是很適合的原因。在大多數(shù)情況下,你需要一個方法來一個字段一個字段地進(jìn)行比較,所以我們認(rèn)為代表相同數(shù)據(jù)的不同對象是相等的。HashCode()方法通過運(yùn)用對象的內(nèi)容執(zhí)行一個哈希函數(shù)來生成一個int值。Hashtable和HashMap用這個值來算出一對key/value位于哪個bucket(哈希元)(或列表)中。如果你
5、想創(chuàng)建一個hashtable,這個hashtable運(yùn)用你自己定義的一個類的對象作為key,那么你應(yīng)該確信這個類的equals()和hashCode()方法提供有用的值。首先查看你擴(kuò)展的類,確定它的實(shí)現(xiàn)是否滿足你的需求。如果沒有,你應(yīng)該重載方法。任何equals()方法的基本設(shè)計(jì)約束是,如果傳遞給它的對象屬于同一個類,而且它的數(shù)據(jù)字段設(shè)定為表示同樣數(shù)據(jù)的值,那么它就應(yīng)該返回true。你也應(yīng)該確信,如果傳遞一個空的參數(shù)給該方法,那么你的代碼返回false:publicbooleanequals(O
6、bjecto){if((o==null)
7、
8、!(oinstanceofmyClass)){returnfalse;}}另外,在設(shè)計(jì)一個hashCode()方法時,應(yīng)該記住一些規(guī)則。首先,該方法必須為一個特定的對象返回相同的值,而不管這個方法被調(diào)用了多少次(當(dāng)然,只要對象的內(nèi)容在調(diào)用之間沒有改變,在將一個對象用做一個hashtable的key時,應(yīng)該避免這一點(diǎn))。第二,如果由你的equals()方法定義的兩個對象是相等的,那么它們也必須生成相同的哈希碼。第三,這更像是一個方針,而不是一個原則,你應(yīng)
9、該設(shè)法設(shè)計(jì)方法,使它為不同的對象內(nèi)容生成不同的結(jié)果。如果偶爾不同的對象正好生成了相同的哈希碼,這也不要緊。但是,如果該方法只能返回范圍在1到10的值,那么只能用10個列表,而不管在hashtable中有多少個列表。Hashtable和HashMapHashtable和HashMap類有三個重要的不同之處。第一個不同主要是歷史原因。Hashtable是基于陳舊的Dictionary類的,HashMap是Java1.2引進(jìn)的Map接口的一個實(shí)現(xiàn)。也許最重要的不同是Hashtable的方法是同步的,而
10、HashMap的方法不是。這就意味著,雖然你可以不用采取任何特殊的行為就可以在一個多線程的應(yīng)用程序中用一個Hashtable,但你必須同樣地為一個HashMap提供外同步。一個方便的方法就是利用Collections類的靜態(tài)的synchronizedMap()方法,它創(chuàng)建一個線程安全的Map對象,并把它作為一個封裝的對象來返回。這個對象的方法可以讓你同步訪問潛在的HashMap。這么做的結(jié)果就是當(dāng)你不需要同步時,你不能切斷Hashtable中的同步(比如在一個單線程的應(yīng)用程序中),而且同步增加了