Java(7-2)

Part1:集合框架中的接口。
這裏寫圖片描述

在圖中(看不見的可能是空間圖片無法上傳,加我2923370475),我們可以看見,集合有兩個基本接口:Collection和Map。

由於Collection,我們可以用以下方法在集合插入元素:boolean add(E element)
不過,由於映射包含鍵/值對,所以要用put方法來插入:V put(K key,V value)
要從集合讀取元素,可以用迭代器訪問元素,但是如果從映射中讀取值,就要使用get方法

V get(K key)

在集合中,我們可以看見,List是一個有序集合,元素會增加到容器中的特定位置。我們可以採用兩種方式訪問元素:1.迭代器2.使用一個整數索引。後一種稱爲因爲可以按照任意順序訪問元素而稱爲隨機訪問。和他相反,迭代器必須順序地訪問元素。

List接口中定義了多個用於隨機訪問的方法:

void add(int index,E element);
void remove(int index);
E get(int index);
E set(int index,E element);

ListIterator接口是Iterator的一個子接口。它定義了一個方法用於在迭代器位置前面增加一個元素。void add(E element)

建議數組使用整數索引來訪問,而鏈表使用迭代器訪問。

Set接口等同於Collection接口,不過其方法的行爲有更嚴謹的定義。集(Set)的add方法不!允!許!增加重複的元素! 要適當的定義集的equals方法:只要兩個集包含同樣的元素就認爲是相等的,而不要求這些元素具有同樣的順序。hashcode方法的定義要保證包含相同元素的兩個集會得到相同的散列碼。

SortedSet 和 SortMap接口都會提供用於排序的比較器對象,這兩個接口定義了可以得到集合子集的方法。

最後在Java6中引入了NavigableSet和NavigableMap,其中包含一些用於搜索和遍歷有序集和映射的方法。

Part2:下面介紹下Java庫中的具體的集合。

  1. ArrayList 一種可以動態增長和縮減的索引序列
  2. LinkedList 一種可以在任何位置進行高效地插入和刪除操作的有序序列
  3. ArrayDeque 一種用循環數組實現的雙端隊列
  4. HashSet 一種沒有重複元素的無序集合
  5. TreeSet 一種有序集
  6. EnumSet 一種包含枚舉類型值的集
  7. LinkedHashSet 一種可以記住元素插入次序的集
  8. PriorityQueue 一種允許高效刪除最小元素的集合
  9. HashMap 一種存儲建/值關聯的數據結構
  10. TreeMap 一種鍵值有序排列的映射表
  11. EnumMap 一種鍵值屬於枚舉類型的映射表
  12. LinkedHashMap 一種可以記住鍵/值項添加次序的映射表
  13. WeakHashMap 一種其值無用處之火可以被垃圾回收的映射表
  14. IdentityHashMap 一種用==而不是equals比較鍵值的映射表

Part3:我們接下來將會具體介紹下LinkedList,HashSet,TreeSet,PriorityQueue等集!

LinkList:
在Java中,所有鏈表都是雙向鏈表,鏈表有屬於他的迭代器,ListIterator。LinkedList的add方法將對象添加到鏈表的尾部,當然,讓的迭代器,ListIterator也包含add方法,另外這個ListIterator接口有兩個方法,可以用來反響遍歷列

E previous()
boolean hasPrevious()

和next方法一樣,previous方法返回越過的對象。還有迭代器的remove方法,需要說明的是add方法只依賴於迭代器的位置,而remove方法依賴與迭代器的狀態。最後ser方法用於用一個新元素取代調用next或previous方法返回的上一個元素。Tip:可以根據需要給容器附加許多的迭代器,但是這些迭代器只能讀取列表。另外,再單獨附加一個既能讀又能寫的迭代器。

列表迭代器接口還有一個方法,可以告知當前位置的索引。nextIndex方法返回下一次調用next方法時返回元素的整數索引;previousIndex方法發牛下一次調用previous時返回元素的整數索引。最後說明一下,如果有一個整數索引n,list.listIterator(n)將返回一個迭代器,這個迭代器指向索引爲n的元素前面的位置。

散列集,HashSet:

鏈表和數組可以按照人們的一員排列元素的次序。但是如果想查看某個指定的元素,卻又忘了他的位置,就需要訪問所有元素,直到找到爲止。HashSet就是能夠快速查找的數據結構,卻低啊是無法控制元素出現的順序。

這裏開始說的是hashtable,也就是散列表,散裂集是基於散列表!
有一種衆所周知的數據結構,可以快速地查找所需要的對象,這就是散列表(hashtable)。散列表爲每個對象計算一個整數,稱爲散列碼。散列碼是由對象的實例域產生的一個整數,更準確地說,具有不同數據域的對象將產生不同的散列碼。(如果自定義了類,就要自己實現這個類的hashcode方法,並且,自己的hashcode方法應該與equals方法兼容,就是說如果a.equals(b)爲true,那a和b必須有相同的散列碼!

再說的細緻一些,在Java中散列表用鏈表數組實現。每個列表被稱爲桶。要想查找表中對象的位置,就要先計算他的散列碼,然後與痛的總數求餘,所得到的結果就是保存這個元素桶的索引。例如,如果某個對象的散列碼是76268,並且有128個桶,因爲76268除以128餘108,所以對象應該保存在108號桶中。

散列表,也就是hashtable可以用於實現幾個重要的數據結構。其中最簡單的是set類型。
Java的集合類庫提供了一個HashSet類,它實現了基於散列表的集。可以用add方法添加元素。contains方法已經被重新定義,用來快速地查看某個元素已經出現在集中。它只在某個桶中查找元素,而不必查看集合中所有元素。散列集迭代器將一次訪問所有的桶,並且訪問的順序是隨機的。

樹集,TreeSet:
樹集是一個有序集合。可以任何順序將元素插入到集合中。對集合進行遍歷時,每個值自動的按照排序後的順序呈現。要使用樹集,必須能夠比較元素。這些元素必須實現Comparable接口,或者構造集時必須提供一個Compartor

隊列和雙端隊列,優先級隊列:

大家都知道,隊列可以讓人們有效地在尾部添加一個元素,在頭部刪除一個元素。有兩個端頭的隊列,稱爲雙端隊列,可以讓人們有效地在頭部和尾部同時添加或者刪除元素。在Java6中引入了Deque接口,並由ArrayDeque和LinkedList類來實現(這裏只需要注意一下雙端隊列的API即可,書上就有)。

優先級隊列,就是說其中的元素可以按照任意的順序插入,卻總是按照排序的順序進行檢索。也就是說,無論什麼時候調用remove方法,總會獲得當前優先級隊列中最小的元素。和Tree一樣,一個優先級隊列既可以保存實現了Compartorable接口的類對象,也可以保存在構造器中提供的Comprator對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章