1. Map 接口概述
java.util.Map 接口描述了映射結(jié)構(gòu), Map 接口允許以鍵集、值集合或鍵 - 值映射關(guān)系集的形式查看某個(gè)映射的內(nèi)容。
Java 自帶了各種 Map 類(lèi)。 這些 Map 類(lèi)可歸為三種類(lèi)型:
1. 通用 Map ,用于在應(yīng)用程序中管理映射,通常在 java.util 程序包中實(shí)現(xiàn)
* HashMap
* Hashtable
* PRoperties
* LinkedHashMap
* IdentityHashMap
* TreeMap
* WeakHashMap
* ConcurrentHashMap
2. 專用 Map ,您通常不必親自創(chuàng)建此類(lèi) Map ,而是通過(guò)某些其他類(lèi)對(duì)其進(jìn)行訪問(wèn)
* java.util.jar.Attributes
* javax.print.attribute.standard.PrinterStateReasons
* java.security.Provider
* java.awt.RenderingHints
* javax.swing.UIDefaults
3. 一個(gè)用于幫助實(shí)現(xiàn)您自己的 Map 類(lèi)的抽象類(lèi)
* AbstractMap
接口中的重要方法如下:
1, 覆蓋的方法
equals(Object o) // 比較指定對(duì)象與此 Map 的等價(jià)性
hashCode() // 返回此 Map 的哈希碼
2, Map 更新方法,可以更改 Map 的內(nèi)容。
put(Object key, Object value) // 添加鍵值對(duì),若鍵已存在,則覆蓋舊值。
putAll(Map t) // 將指定 Map 中的所有映射復(fù)制到此 map
remove(Object key) // 從 Map 中刪除與 key 關(guān)聯(lián)的 value
clear() // 從 Map 中刪除所有映射
3, 返回視圖的 Map 方法:使用這些方法返回的對(duì)象,你可以遍歷和刪除 Map 的元素。
Set keySet() // 返回 Map 中所包含鍵的 Set 視圖。
// 刪除 Set 中的 key 元素還將刪除 Map 中相應(yīng)的映射(鍵和值)
Collection values() // 返回 map 中所包含值的 Collection 視圖。
// 刪除 Collection 中的 value 元素還將刪除 Map 中相應(yīng)的映射(鍵和值)
Set entrySet() // 返回 Map 中所包含映射的 Set 視圖(鍵值對(duì))。
Set 中的每個(gè)元素都是一個(gè) Map.Entry 對(duì)象,可以使用 getKey() 和 getValue() 方法(還有一個(gè) setValue() 方法)訪問(wèn) Map.Entry 對(duì)象的鍵元素和值元素
關(guān)于 Map.Entry 接口
Map 的 entrySet() 方法返回一個(gè)實(shí)現(xiàn) Map.Entry 接口的對(duì)象集合。集合中每個(gè)對(duì)象都是底層 Map 中一個(gè)特定的鍵 / 值對(duì)。通過(guò)這個(gè)集合的迭代器,您可以獲得每一個(gè)條目 ( 唯一獲取方式 ) 的鍵或值并對(duì)值進(jìn)行更改。
(1) Object getKey(): 返回條目的關(guān)鍵字
(2) Object getValue(): 返回條目的值
(3) Object setValue(Object value): 將相關(guān)映像中的值改為 value ,并且返回舊值
當(dāng)條目通過(guò)迭代器返回后,除非是迭代器自身的 remove() 方法或者迭代器返回的條目的 setValue() 方法,其余對(duì)源 Map 外部的修改都會(huì)導(dǎo)致此條目集變得無(wú)效,同時(shí)產(chǎn)生條目行為未定義。
4, Map 訪問(wèn)和測(cè)試方法:這些方法檢索有關(guān) Map 內(nèi)容的信息但不更改 Map 內(nèi)容。
get(Object key) // 返回與指定鍵關(guān)聯(lián)的值 及此對(duì)象,若無(wú),返回 null 。
boolean containsKey(Object key) // 如果 Map 包含指定鍵的映射,則返回 true
boolean containsValue(Object value) // 若此 Map 將一個(gè)或多個(gè)鍵映射到指定值,返回 true
isEmpty() // 如果 Map 不包含鍵 - 值映射,則返回 true
int size() // 返回 Map 中的鍵 - 值映射的數(shù)目
幾乎所有通用 Map 都使用哈希映射。 這是一種將元素映射到數(shù)組的非常簡(jiǎn)單的機(jī)制,您應(yīng)了解哈希映射的工作原理,以便充分利用 Map 。
哈希映射結(jié)構(gòu)由一個(gè)存儲(chǔ)元素的內(nèi)部數(shù)組組成。 由于內(nèi)部采用數(shù)組存儲(chǔ),因此必然存在一個(gè)用于確定任意鍵訪問(wèn)數(shù)組的索引機(jī)制。 實(shí)際上,該機(jī)制需要提供一個(gè)小于數(shù)組大小的整數(shù)索引值(即余數(shù))。 該機(jī)制稱作哈希函數(shù)。 在 Java 基于哈希的 Map 中,哈希函數(shù)將對(duì)象轉(zhuǎn)換為一個(gè)適合內(nèi)部數(shù)組的整數(shù)。您不必為尋找一個(gè)易于使用的哈希函數(shù)而大傷腦筋: 每個(gè)對(duì)象都包含一個(gè)返回整數(shù)值的 hashCode() 方法。 要將該值映射到數(shù)組,只需將其轉(zhuǎn)換為一個(gè)正值,然后在將該值除以數(shù)組大小后取余數(shù)即可。
哈希函數(shù)將任意對(duì)象映射到一個(gè)數(shù)組位置,但如果兩個(gè)不同的鍵映射到相同的位置,情況將會(huì)如何? 這是一種必然發(fā)生的情況。 在哈希映射的術(shù)語(yǔ)中,這稱作沖突。 Map 處理這些沖突的方法是在索引位置處插入一個(gè)鏈接列表,并簡(jiǎn)單地將元素添加到此鏈接列表。
圖示:
迭代器(Iterator)
迭代器是一種設(shè)計(jì)模式,它是一個(gè)對(duì)象,它可以遍歷并選擇序列中的對(duì)象,而開(kāi)發(fā)人員不需要了解該序列的底層結(jié)構(gòu)。迭代器通常被稱為“輕量級(jí)”對(duì)象,因?yàn)閯?chuàng)建它的代價(jià)小。
Java中的Iterator功能比較簡(jiǎn)單,并且只能單向移動(dòng):
(1) 使用方法iterator()要求容器返回一個(gè)Iterator。第一次調(diào)用Iterator的next()方法時(shí),它返回序列的第一個(gè)元素。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。
(2) 使用next()獲得序列中的下一個(gè)元素。
(3) 使用hasNext()檢查序列中是否還有元素。
(4) 使用remove()將迭代器新返回的元素刪除。
Iterator是Java迭代器最簡(jiǎn)單的實(shí)現(xiàn),為L(zhǎng)ist設(shè)計(jì)的ListIterator具有更多的功能,它可以從兩個(gè)方向遍歷List,也可以從List中插入和刪除元素。
List接口有一個(gè)特有的方法,listIterator。
使用Iterator迭代器缺點(diǎn):
1. ListIterator有add()方法,可以向List中添加對(duì)象,而Iterator不能
2. ListIterator和Iterator都有hasNext()和next()方法,可以實(shí)現(xiàn)順序向后遍歷,但是ListIterator有hasprevious()和previous()方法,可以實(shí)現(xiàn)逆向(順序向前)遍歷。Iterator就不可以。
3. ListIterator可以定位當(dāng)前的索引位置,nextIndex()和previousIndex()可以實(shí)現(xiàn)。Iterator沒(méi)有此功能。
4. 都可實(shí)現(xiàn)刪除對(duì)象,但是ListIterator可以實(shí)現(xiàn)對(duì)象的修改,set()方法可以實(shí)現(xiàn)。Iierator僅能遍歷,不能修改。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注