天天看點

JAVA集合架構之Map接口實作類java.util.HashMap<K,V>java.util.Hashtable<K,V>java.util.LinkedHashMap<K,V>java.util.TreeMap<K,V>java.util.Properties

基于哈希表的 map 接口的實作。此實作提供所有可選的映射操作,并允許使用 null 值和 null 鍵。(除了非同步和允許使用 null 之外,hashmap 類與 hashtable 大緻相同。)此類不保證映射的順序,特别是它不保證該順序恒久不變。

此實作假定哈希函數将元素适當地分布在各桶之間,可為基本操作(get 和 put)提供穩定的性能。疊代 collection 視圖所需的時間與 hashmap 執行個體的“容量”(桶的數量)及其大小(鍵-值映射關系數)成比例。是以,如果疊代性能很重要,則不要将初始容量設定得太高(或将加載因子設定得太低)。

hashmap 的執行個體有兩個參數影響其性能:初始容量 和加載因子。容量 是哈希表中桶的數量,初始容量隻是哈希表在建立時的容量。加載因子 是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數超出了加載因子與目前容量的乘積時,則要對該哈希表進行 rehash 操作(即重建内部資料結構),進而哈希表将具有大約兩倍的桶數。

通常,預設加載因子 (.75) 在時間和空間成本上尋求一種折衷。加載因子過高雖然減少了空間開銷,但同時也增加了查詢成本(在大多數 hashmap 類的操作中,包括 get 和 put 操作,都反映了這一點)。在設定初始容量時應該考慮到映射中所需的條目數及其加載因子,以便最大限度地減少 rehash 操作次數。如果初始容量大于最大條目數除以加載因子,則不會發生 rehash 操作。

如果很多映射關系要存儲在 hashmap 執行個體中,則相對于按需執行自動的 rehash 操作以增大表的容量來說,使用足夠大的初始容量建立它将使得映射關系能更有效地存儲。

方法名

說明

hashmap()

構造一個具有預設初始容量 (16) 和預設加載因子 (0.75) 的空 hashmap

hashmap(int initialcapacity)

構造一個帶指定初始容量和預設加載因子 (0.75) 的空 hashmap

hashmap(int initialcapacity, float loadfactor)

構造一個帶指定初始容量和加載因子的空 hashmap

hashmap(map<? extends k, ? extends v> m)

構造一個映射關系與指定 map 相同的新 hashmap

傳回值

void

clear()

從此映射中移除所有映射關系

object

clone()

傳回此 hashmap 執行個體的淺表副本:并不複制鍵和值本身

boolean

containskey(object key)

如果此映射包含對于指定鍵的映射關系,則傳回 true

containsvalue(object value)

如果此映射将一個或多個鍵映射到指定值,則傳回 true

set<map.entry<k,v>>

entryset()

傳回此映射所包含的映射關系的 set 視圖

v

get(object key)

傳回指定鍵所映射的值;如果對于該鍵來說,此映射不包含任何映射關系,則傳回 null

isempty()

如果此映射不包含鍵-值映射關系,則傳回 true

set<k>

keyset()

傳回此映射中所包含的鍵的 set 視圖

put(k key, v value)

在此映射中關聯指定值與指定鍵

putall(map<? extends k,? extends v> m)

将指定映射的所有映射關系複制到此映射中,這些映射關系将替換此映射目前針對指定映射中所有鍵的所有映射關系

remove(object key)

從此映射中移除指定鍵的映射關系(如果存在)

int

size()

傳回此映射中的鍵-值映射關系數

collection<v>

values()

傳回此映射所包含的值的 collection 視圖

由上面例子的運作結果我們可以看出,周遊hashmap中的元素時順序不是恒定不變的。

hashtable實作一個哈希表,該哈希表将鍵映射到相應的值。任何非 null 對象都可以用作鍵或值。

hashtable與hashmap的差別主要有以下幾點:

hashtable是dictionary的子類,hashmap是map接口的一個實作類;

hashtable中的方法是同步的,而hashmap中的方法在預設情況下是非同步的。即是說,在多線程應用程式中,不用專門的操作就安全地可以使用hashtable了;而對于hashmap,則需要額外的同步機制。但hashmap的同步問題可通過collections的一個靜态方法得到解決:<code>map collections.synchronizedmap(map m)</code>這個方法傳回一個同步的map,這個map封裝了底層的hashmap的所有方法,使得底層的hashmap即使是在多線程的環境中也是安全的。

在hashmap中,null可以作為鍵,這樣的鍵隻有一個;可以有一個或多個鍵所對應的值為null。當get()方法傳回null值時,即可以表示hashmap中沒有該鍵,也可以表示該鍵所對應的值為null。是以,在hashmap中不能由get()方法來判斷hashmap中是否存在某個鍵,而應該用containskey()方法來判斷。

hashtable()

用預設的初始容量 (11) 和加載因子 (0.75) 構造一個新的空哈希表

hashtable(int initialcapacity)

用指定初始容量和預設的加載因子 (0.75) 構造一個新的空哈希表

hashtable(int initialcapacity, float loadfactor)

用指定初始容量和指定加載因子構造一個新的空哈希表

hashtable(map&lt;? extends k, ? extends v&gt; t)

構造一個與給定的 map 具有相同映射關系的新哈希表

将此哈希表清空,使其不包含任何鍵。

建立此哈希表的淺表副本。

contains(object value)

測試此映射表中是否存在與指定值關聯的鍵。

測試指定對象是否為此哈希表中的鍵。

如果此 hashtable 将一個或多個鍵映射到此值,則傳回 true。

enumeration&lt;v&gt;

elements()

傳回此哈希表中的值的枚舉。

傳回此映射中包含的鍵的 set 視圖。

equals(object o)

按照 map 接口的定義,比較指定 object 與此 map 是否相等。

傳回指定鍵所映射到的值,如果此映射不包含此鍵的映射,則傳回 null. 更确切地講,如果此映射包含滿足 (key.equals(k)) 的從鍵 k 到值 v 的映射,則此方法傳回 v;否則,傳回 null。

hashcode()

按照 map 接口的定義,傳回此 map 的哈希碼值。

測試此哈希表是否沒有鍵映射到值。

enumeration&lt;k&gt;

keys()

傳回此哈希表中的鍵的枚舉。

将指定 key 映射到此哈希表中的指定 value。

putall(map&lt;? extends k,? extends v&gt; t)

将指定映射的所有映射關系複制到此哈希表中,這些映射關系将替換此哈希表擁有的、針對目前指定映射中所有鍵的所有映射關系。

protected void

rehash()

增加此哈希表的容量并在内部對其進行重組,以便更有效地容納和通路其元素。

從哈希表中移除該鍵及其相應的值。

傳回此哈希表中的鍵的數量。

string

tostring()

傳回此 hashtable 對象的字元串表示形式,其形式為 ascii 字元 “, ” (逗号加空格)分隔開的、括在括号中的一組條目。

傳回此映射中包含的鍵的 collection 視圖

hashtable與hashmap使用方式類似,這裡就不寫例子了。

map 接口的哈希表和連結清單實作,具有可預知的疊代順序。此實作與 hashmap 的不同之處在于,後者維護着一個運作于所有條目的雙重連結清單。此連結清單定義了疊代順序,該疊代順序通常就是将鍵插入到映射中的順序(插入順序)。注意,如果在映射中重新插入鍵,則插入順序不受影響。(如果在調用 m.put(k, v) 前 m.containskey(k) 傳回了 true,則調用時會将鍵 k 重新插入到映射 m 中。)

此實作可以讓客戶避免未指定的、由 hashmap(及 hashtable)所提供的通常為雜亂無章的排序工作,同時無需增加與 treemap 相關的成本。

linkedhashmap()

構造一個帶預設初始容量 (16) 和加載因子 (0.75) 的空插入順序linkedhashmap 執行個體

linkedhashmap(int initialcapacity)

構造一個帶指定初始容量和預設加載因子 (0.75) 的空插入順序linkedhashmap 執行個體

linkedhashmap(int initialcapacity, float loadfactor)

構造一個帶指定初始容量和加載因子的空插入順序 linkedhashmap 執行個體

linkedhashmap(int initialcapacity, float loadfactor, boolean accessorder)

構造一個帶指定初始容量、加載因子和排序模式的空 linkedhashmap 執行個體

linkedhashmap(map&lt;&lt;? extends k, ? extends v&gt; m)

構造一個映射關系與指定映射相同的插入順序 linkedhashmap 執行個體

從該映射中移除所有映射關系

傳回此映射到指定鍵的值

protected boolean

removeeldestentry(map.entry&lt;k,v&gt; eldest)

如果此映射移除其最舊的條目,則傳回 true

linkedhashmap繼承自hashmap,是以linkedhashmap具有hashmap的所有功能,可直接将hashmap例子中的類名替換為linkedhashmap,運作後注意觀察周遊集合的結果,這也是linkedhashmap與hashmap最大的不同。周遊linkedhashmap中的元素時,元素順序與元素添加順序相同。

基于紅黑樹(red-black tree)的 navigablemap 實作。該映射根據其鍵的自然順序進行排序,或者根據建立映射時提供的 comparator 進行排序,具體取決于使用的構造方法。

treemap()

使用鍵的自然順序構造一個新的、空的樹映射

treemap(comparator&lt;? super k&gt; comparator)

構造一個新的、空的樹映射,該映射根據給定比較器進行排序

treemap(map&lt;? extends k,? extends v&gt; m)

構造一個與給定映射具有相同映射關系的新的樹映射,該映射根據其鍵的自然順序 進行排序

treemap(sortedmap&lt;k,? extends v&gt; m)

構造一個與指定有序映射具有相同映射關系和相同排序順序的新的樹映射

map.entry&lt;k,v&gt;

ceilingentry(k key)

傳回一個鍵-值映射關系,它與大于等于給定鍵的最小鍵關聯;如果不存在這樣的鍵,則傳回 null

k

ceilingkey(k key)

傳回大于等于給定鍵的最小鍵;如果不存在這樣的鍵,則傳回 null

傳回此 treemap 執行個體的淺表副本

comparator&lt;? super k&gt;

comparator()

傳回對此映射中的鍵進行排序的比較器;如果此映射使用鍵的自然順序,則傳回 null

如果此映射包含指定鍵的映射關系,則傳回 true

如果此映射為指定值映射一個或多個鍵,則傳回 true

navigableset&lt;k&gt;

descendingkeyset()

傳回此映射中所包含鍵的逆序 navigableset 視圖

navigablemap&lt;k,v&gt;

descendingmap()

傳回此映射中所包含映射關系的逆序視圖

傳回此映射中包含的映射關系的 set 視圖

firstentry()

傳回一個與此映射中的最小鍵關聯的鍵-值映射關系;如果映射為空,則傳回 null

firstkey()

傳回此映射中目前第一個(最低)鍵

floorentry(k key)

傳回一個鍵-值映射關系,它與小于等于給定鍵的最大鍵關聯;如果不存在這樣的鍵,則傳回 null

floorkey(k key)

傳回小于等于給定鍵的最大鍵;如果不存在這樣的鍵,則傳回 null

傳回指定鍵所映射的值,如果對于該鍵而言,此映射不包含任何映射關系,則傳回 null

sortedmap&lt;k,v&gt;

headmap(k tokey)

傳回此映射的部分視圖,其鍵值嚴格小于 tokey

headmap(k tokey, boolean inclusive)

傳回此映射的部分視圖,其鍵小于(或等于,如果 inclusive 為 true)tokey

higherentry(k key)

傳回一個鍵-值映射關系,它與嚴格大于給定鍵的最小鍵關聯;如果不存在這樣的鍵,則傳回 null

higherkey(k key)

傳回嚴格大于給定鍵的最小鍵;如果不存在這樣的鍵,則傳回 null

傳回此映射包含的鍵的 set 視圖

lastentry()

傳回與此映射中的最大鍵關聯的鍵-值映射關系;如果映射為空,則傳回 null

lastkey()

傳回映射中目前最後一個(最高)鍵

lowerentry(k key)

傳回一個鍵-值映射關系,它與嚴格小于給定鍵的最大鍵關聯;如果不存在這樣的鍵,則傳回 null

lowerkey(k key)

傳回嚴格小于給定鍵的最大鍵;如果不存在這樣的鍵,則傳回 null

navigablekeyset()

傳回此映射中所包含鍵的 navigableset 視圖

pollfirstentry()

移除并傳回與此映射中的最小鍵關聯的鍵-值映射關系;如果映射為空,則傳回 null

polllastentry()

移除并傳回與此映射中的最大鍵關聯的鍵-值映射關系;如果映射為空,則傳回 null

将指定值與此映射中的指定鍵進行關聯

putall(map&lt;? extends k,? extends v&gt; map)

将指定映射中的所有映射關系複制到此映射中

如果此 treemap 中存在該鍵的映射關系,則将其删除

submap(k fromkey, boolean frominclusive, k tokey, boolean toinclusive)

傳回此映射的部分視圖,其鍵的範圍從 fromkey 到 tokey

submap(k fromkey, k tokey)

傳回此映射的部分視圖,其鍵值的範圍從 fromkey(包括)到 tokey(不包括)

tailmap(k fromkey)

傳回此映射的部分視圖,其鍵大于等于 fromkey

tailmap(k fromkey, boolean inclusive)

傳回此映射的部分視圖,其鍵大于(或等于,如果 inclusive 為 true)fromkey

傳回此映射包含的值的 collection 視圖

treemap與hashmap的用法也基本相同,不同之處也是元素的順序。

properties 類表示了一個持久的屬性集。properties 可儲存在流中或從流中加載。屬性清單中每個鍵及其對應值都是一個字元串。

一個屬性清單可包含另一個屬性清單作為它的“預設值”;如果未能在原有的屬性清單中搜尋到屬性鍵,則搜尋第二個屬性清單。

因為 properties 繼承于 hashtable,是以可對 properties 對象應用 put 和 putall 方法。但不建議使用這兩個方法,因為它們允許調用者插入其鍵或值不是 string 的項。相反,應該使用 setproperty 方法。如果在“不安全”的 properties 對象(即包含非 string 的鍵或值)上調用 store 或 save 方法,則該調用将失敗。類似地,如果在“不安全”的 properties 對象(即包含非 string 的鍵)上調用propertynames 或 list 方法,則該調用将失敗。

properties()

建立一個無預設值的空屬性清單

properties(properties defaults)

建立一個帶有指定預設值的空屬性清單

getproperty(string key)

用指定的鍵在此屬性清單中搜尋屬性

getproperty(string key, string defaultvalue)

用指定的鍵在屬性清單中搜尋屬性

list(printstream out)

将屬性清單輸出到指定的輸出流

list(printwriter out)

load(inputstream instream)

從輸入流中讀取屬性清單(鍵和元素對)

load(reader reader)

按簡單的面向行的格式從輸入字元流中讀取屬性清單(鍵和元素對)

loadfromxml(inputstream in)

将指定輸入流中由 xml 文檔所表示的所有屬性加載到此屬性表中

enumeration&lt;?&gt;

propertynames()

傳回屬性清單中所有鍵的枚舉,如果在主屬性清單中未找到同名的鍵,則包括預設屬性清單中不同的鍵

save(outputstream out, string comments)

已過時如果在儲存屬性清單時發生 i/o 錯誤,則此方法不抛出 ioexception儲存屬性清單的首選方法是通過 store(outputstream out, string comments) 方法或 storetoxml(outputstream os, string comment) 方法來進行

setproperty(string key, string value)

調用 hashtable 的方法 put

store(outputstream out, string comments)

以适合使用 load(inputstream) 方法加載到 properties 表中的格式,将此 properties 表中的屬性清單(鍵和元素對)寫入輸出流

store(writer writer, string comments)

以适合使用 load(reader) 方法的格式,将此 properties 表中的屬性清單(鍵和元素對)寫入輸出字元

storetoxml(outputstream os, string comment)

發出一個表示此表中包含的所有屬性的 xml 文檔

storetoxml(outputstream os, string comment, string encoding)

使用指定的編碼發出一個表示此表中包含的所有屬性的 xml 文檔

set&lt;string&gt;

stringpropertynames()

傳回此屬性清單中的鍵集,其中該鍵及其對應值是字元串,如果在主屬性清單中未找到同名的鍵,則還包括預設屬性清單中不同的鍵

打開持久化檔案的檢視内容(文本)如下:

#propertiesdemo

#tue dec 29 09:44:52 cst 2015

key9=value9

key8=value8

key7=value7

key6=value6

key5=value5

key4=value4

key3=value3

key2=value2

key1=value1

key0=value0

上述例子中,隻介紹了如何将properties持久化到properties檔案中,properties還可以直接持久化到xml中,大家可以自己試一下。