1. 程式人生 > >Java中集中常見的資料結構(轉自CSDN,整理編寫)

Java中集中常見的資料結構(轉自CSDN,整理編寫)

關於資料結構

java中有幾種常用的資料結構,主要分為Collection和map兩個主要介面(介面只提供方法,並不提供實現),而程式中最終使用的資料結構是繼承自這些介面的資料結構類。其主要的關係(繼承關係)有:

Collection—->Collections
Collection—->List—–>(Vector \ ArrayList \ LinkedList)
Collection—->Set—–>(HashSet \ LinkedHashSet \ SortedSet)
Map—–>SortedMap——>TreeMap
Map—–>HashMap

Collection

1.Collections(操作集合的工具類)

對於集合類的操作提供了很多方法,如求兩個集合的差集,並集,拷貝,排序等.
由於大部分的集合介面實現類都是不同步的,可以使用Collections,synchronized方法建立同步的集合類物件.

2.List(列表)

List是有序的Collection,使用此介面能夠精確地控制每一個元素插入的位置.使用者能夠使用索引(元素在List中的位置,類似陣列的下標)來訪問List中的元素,這類似於Java的陣列.

(1)Vector

線性表,使用Object陣列作為容器去儲存資料的.基於陣列(Array)的List,其實就是封裝了陣列所不具備的一些功能,難以避免陣列的限制,效能也不可能超越陣列.所以,在可能的情況下,我們要多使用陣列.另外很重要的一點是Vector是執行緒同步的(synchronized)的,這是Vector與ArrayList的一個重要區別.

(2)ArrayList

同Vector一樣是基於陣列的線性連結串列,但是不同的是ArrayList是非執行緒安全的,不同步.所以在效能上要比Vector好一些,但是在多執行緒的環境要注意設定執行緒同步問題.

(3)LinkedList

LinkedList不用於前面兩種List,不基於陣列,不受陣列效能限制.
它每個節點(Node)都包含兩個方面的內容:
1.節點本身的資料(data)
2.下一個節點的資訊(nextNode)
所以當對LinkedList做天劍,刪除操作的時候不用像基於陣列的ArrayList一樣,必須進行大量的資料移動.只要改nextNode的相關資訊就可以實現

,這是LinkedList優勢.

3.List總結

  • 所有的List中只能容納單個不同型別的物件組成的表,而不是Key-Value鍵值對
  • 所有的List中可以有相同的元素,例如Vector中[tom,tom,koo,koo]
  • 所有的List中可以有null元素,例如[tom,null,1]
    基於Array的List(Vector和ArrayList)適合查詢,而LinkedList適合新增,刪除操作.

4.Set(介面)

Set是不包含重複元素的Collection

(1)HashSet

雖然Set同List都實現了Collection介面,但是它們的實現方式卻大不相同,List基本上是基於Array,而Set是基於HashMap
這個是Set和List的根本區別.HashSet的儲存方式是把HashMap的Key作為Set的對應儲存項.使用hashcode和equals方法進行判斷元素是否重複.
當你試圖把物件加入HashSet時,HashSet會使用物件的hashCode來判斷物件加入的位置.同時也會與其他已經加入的物件的hashCode進行比較,如果沒有相等的hashCode,HashSet就會假設物件沒有重複出現.
簡單一句話,如果物件的hashCode值是不同的,那麼HashSet會認為物件是不可能相等的

(2)LinkedHashSet

HashSet的一個子類,一個連結串列.會儲存插入的順序

(3)SortedSet

有序的Set,通過SortedMap來實現的.

4,Set總結

  • Set實現的基礎是Map(HashMap)
  • Set中的元素是不重複的,如果使用add(Object object)方法新增已存在的物件,則會覆蓋之前的物件.

5.Map

Map 是一種把鍵物件和值物件進行關聯的容器,而一個值物件又可以是一個Map,依次類推,這樣就可形成一個多級對映。對於鍵物件來說,像Set一樣,一個 Map容器中的鍵物件不允許重複,這是為了保持查詢結果的一致性;如果有兩個鍵物件一樣,那你想得到那個鍵物件所對應的值物件時就有問題了,可能你得到的並不是你想的那個值物件,結果會造成混亂,所以鍵的唯一性很重要,也是符合集合的性質的。當然在使用過程中,某個鍵所對應的值物件可能會發生變化,這時會按照最後一次修改的值物件與鍵對應。對於值物件則沒有唯一性的要求,你可以將任意多個鍵都對映到一個值物件上,這不會發生任何問題(不過對你的使用卻可能會造成不便,你不知道你得到的到底是那一個鍵所對應的值物件)。

(1)HashMap

(2)TreeMap

TreeMap是按鍵順序存放的,因此它便有一些擴充套件的方法,比如firstKey(),lastKey()等,你還可以從TreeMap中指定一個範圍以取得其子Map.
鍵和值的關聯很簡單,用put(Object key,Object value)方法即可將一個鍵與一個值物件相關聯。用get(Object key)可得到與此key物件所對應的值物件。

6.總結資料結構

一、幾個常用類的區別
1.ArrayList: 元素單個,效率高,多用於查詢
2.Vector: 元素單個,執行緒安全,多用於查詢
3.LinkedList:元素單個,多用於插入和刪除
4.HashMap: 元素成對,元素可為空
5.HashTable: 元素成對,執行緒安全,元素不可為空

二、Vector、ArrayList和LinkedList
大多數情況下,從效能上來說ArrayList最好,但是當集合內的元素需要頻繁插入、刪除時LinkedList會有比較好的表現,但是它們三個效能都比不上陣列,另外Vector是執行緒同步的。所以:
如果能用陣列的時候(元素型別固定,陣列長度固定),請儘量使用陣列來代替List;
如果沒有頻繁的刪除插入操作,又不用考慮多執行緒問題,優先選擇ArrayList;
如果在多執行緒條件下使用,可以考慮Vector;
如果需要頻繁地刪除插入,LinkedList就有了用武之地;
如果你什麼都不知道,用ArrayList沒錯。

看到hash,就要想到hashCode,equals.
看到tree,就要想到兩個介面。Comparable,Comparator。