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