Collection和Map總結

    本篇博客只是對於自己學習java提供的collection和map兩種容器的總結,從每種容器的優缺點和底層實現的角度,做了簡單的總結,所以要求閱讀者對於java容器這一塊有基本的認識。

數據結構:

是以某種形式將數據組織在一起的集合,數據結構不僅存儲數據,還支持那些訪問和處理數據的操作。在面向對象的思想裏,一種數據結構被認爲是一種容器,是個能存儲其他對象的對象,所以一種數據結構本質上是一個類,使用數據域存儲數據,同時提供方法支持查找,插入,刪除等動作。


java提供了兩種容器:

一種是爲了存儲一個元素的集合,成爲集合(Collection

一種是爲了存儲鍵/值對,稱爲圖(map)。


Set:用於存儲互不相同的元素。

List:用於存儲有序元素的集合。

Map:存儲鍵值對。


對於接口的具體實現:


上面這張圖是對於每種接口的具體的實現類。


java原生數據類型:

基本數據類型是四類八種

第一類:整型 byte short int long
第二類:浮點型 float double
第三類:邏輯型 boolean(它只有兩個值可取true false)
第四類:字符型 char

這八種java原生數據類型不是對象,其餘的都是對象比如Integer就是對象。


爲什麼這裏插入java原生的數據類型那:

   集合中放置的都是對象,是不能夠放置原生的數據類型的。我們在使用的時候需要使用原生數據類型的包裝類才能加入到集合中。因爲集合中放置的都是object類型,因此取出來的時候也是object類型,那麼必須使用強制類型轉換將其轉換爲真正的類型(就是我們放進去時候的類型)。

 

set

HashSet:

中的元素是沒有被排序的。

底層實現:底層是採用hashmap來實現的,當使用add方法將對象添加到set中的時候,實際上是將對象作爲底層所維護的map對象中的key,而value則是同一個object對象,這個對象我們是用不上的。

LinkedHashSet:

是鏈表是先的擴展HashSet類,支持對元素的排序。保持元素插入的時候的順序。

TreeSet:

set的子接口,是實現了SortedSet接口的具體類,確保規則集中的元素是有序的,允許自定義排序。

    排序使用的方法:

①使用Compareable接口,由於添加到set中的對象都是compareable的實例,所以可以使用compareto的方法對他們進行排序,這是一中默認的方式的排序。

②在被插入的對象沒有實現java.lang.Comparable類的時候,我們可以定義一本比較器來比較這些元素,就是java.util.Comparator接口中的compareequals的方法。讓我們新放入的對象來實現這個接口。

 

實現set接口的幾種類型的比較:

如果我們不需要保持元素的排序關係,我們使用hashset,應爲hashset中插入和刪除元素花費的時間比較少,如果需要一個排好序的集合的時候,可以從這個集合中創建一個樹形集。



list

List:允許存儲重複的元素,並且允許指定存儲的位置,用戶可以使用下標來訪問元素。

擴展了collection的接口,並且雙向遍歷線性表增加了一個列表迭代器java.util.Iterator.

Arraylist:

可變大小的數組。

   底層採用的數組來實現的,當採用不帶參數的構造方法生成arraylist對象時,實際上會在底層生成一個長度爲10的object類型的數組。如果元素超過了數組的容量,就會創建一個更大的新數組,並將當前的數組複製到新的數組中。

  對於刪除或者插入操作,如果不是在末尾進行,需要將刪除或者插入元素的後續元素向前或者向後移動代價是比較大的。(知識有底層的實現方式決定的。)

linkedlist

採用的是鏈表來實現的底層,在鏈表中存儲元素。

所謂的鏈表底層實現,是通過我們存儲的對象經過我們entry類型包裝形成的。也就是linkedlist是由多個entry包裝好的對象組成的。


實現list接口的兩種類型的比較:

    操作插入和刪除的時候linkedlist只需要操作指針,而arraylist需要移動數據(除了在末尾插入或者刪除元素外,這候arraylistlinkedlist效率高)。

    在訪問元素的時候Arraylist是連續存放的只要找到了第一個,加上50就找到了第五十一個。,而linkelist是需要一個個的往後找。


set和list的比較:

set是比list更加高效的,如果應用程序用set就足夠,那麼就使用set,在這個基礎還是那個如果程序不需要特別順序嗎,就選擇hashset



Map

集合看完了,我們下載來看看我們的圖:就是map:中的鍵值不能夠重複的。

hashMap:

條目沒有順序的,放進去和取出來不一定是同樣的順序。定位一個映射,插入一個映射,刪除一個映射,最高效。

    mapkeyset()方法會返回key的集合,因爲map的鍵值不能夠重複的,所以keySet()的方法返回的類型是set。而mapvalue值是可以重複的,因此vlaues()方法的返回類型是Collection,可以容納重複的元

素。

    底層實現:HashMap底層就是一個數組結構,每個數組元素的類型都是鏈表,鏈表中每個entry又是有鏈表這種結構不斷往下鏈。每個entry裏面是有keyvalue

。當新建一個HashMap的時候,就會初始化一個數組。當向裏面put一堆鍵值的時候,他會根據keyhashcode值計算出一個位置(數組上面的位置),這個位置就是此對象要放置的位置,如果這個數組位置上面有對象了,那麼對象放入到鏈表的頭部,最先加入的放在鏈尾。下面這張圖是我們hashmap的最終結構圖


LinkedHashMap

使用鏈表實現來擴展hashMap,支持條目的排序(按照插入順序或者訪問順序來排序)。

TreeMap:

在遍歷排好順序的鍵值時候是很高效的。

treeset一樣可以使用Comparable或者Comparator接口來排序,實現了sortedMap接口。

 

注意

①關於hashmap的底層可以網上詳細瞭解一下,這裏推薦:

http://www.cnblogs.com/xwdreamer/archive/2012/06/03/2532832.html

②在java語言中歸根到底是由數組來維護或者是鏈表,或者兩者混合結構,才能夠維護一羣對象。

③鏈表中的元素是entryEntry的具體結構:



詳細的請自己百度。

④對於接口collection和map的實現類的數據結構的特性是由底層的數據結構實現決定的。


本篇文章只是一個總結。


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