JAVA ,Map接口 ,迭代器Iterator


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. ListIteratoradd()方法,可以向List中添加對象,而Iterator不能

  2. ListIteratorIterator都有hasNext()next()方法,可以實現順序向后遍歷,但是ListIteratorhasPrevious()previous()方法,可以實現逆向(順序向前)遍歷。Iterator就不可以。

  3. ListIterator可以定位當前的索引位置,nextIndex()previousIndex()可以實現。Iterator沒有此功能。

  4. 都可實現刪除對象,但是ListIterator可以實現對象的修改,set()方法可以實現。Iierator僅能遍歷,不能修改。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM