java-集合學習-底層實現


 集合分為兩大類:

         Collection集合: 單個存儲

         Map集合: 按<鍵,值>對的形式存儲,  <員工姓名,工資>

Collection類關系圖

 

Collection常見方法

 

boolean

add(E e) 在當前集合中添加元素e

boolean

addAll(Collection<? extends E> c) 把參數集合c中的所有元素都添加到當前集合中

void

clear() 清空集合中所有的元素.

boolean

contains(Object o) 判斷當前集合中是否包含元素o

boolean

isEmpty() 判斷集合是否為空

Iterator<E>

iterator() 返回集合的迭代器

boolean

remove(Object o) 在當前集合中刪除第一個與o匹配的元素

boolean

removeAll(Collection<?> c) 在當前集合中刪除在參數集合c中存在的元素

int

size() 返回元素的個數.

Object[]

toArray() 轉換為數組

<T> T[]

toArray(T[] a)

 

 

-------------------------------------------------------------

List接口繼承了Collection接口. Collection的所有操作List都可以繼承到

         List存儲特點:

                   有序,可重復

 

         List集合為每個元素指定一個索引值,增加了針對索引值的操作

                   add(index, o)                     remove(index)                    get(index)         set(index, o)

                   sort( Comparator )

》》》》》》》》》》》》》》

 ArrayList與Vector

1)       底層是數組, 訪問快,添加刪除慢

2)       ArrayList不是線程安全的,Vector是線程安全的

3)       ArrayList初始化容量: 10 ,  Vector初始化容量: 10

4)       擴容ArrayList按1.5倍, Vector按2倍大小擴容

---------------------------------------------------------------------------

Set集合

無序, 存儲順序可能與添加順序不一樣

         不能存儲重復的數據

---------------------------------------------------------------

單向鏈表

由若干個節點組成,每個節點除了數據域之外還保存一個指向下個節點的指針域。

優點:

插入/刪除元素時,不需要像數組一樣還得擴容、復制/移動元素,只需要修改一下next指針域即可。

缺點:

訪問時,總是從第一個結點依次向后訪問,只能向后訪問,不能向前訪問。

 

雙向鏈表

LinkedList底層采用雙向鏈表

使用LinkedList模擬棧結構。棧結構特點:后進先出。

Push()

Pop()

 

使用LinkedList,模擬隊列。隊列:先進先出。

Offer()

Poll();

單項鏈表示例圖:

雙向鏈表示例圖:

 

 --------------------------------------------------------------

 HashSet


* 1)底層是HashMap
* 2)向HashSet添加元素就是把該元素作為鍵添加到底層的HashMap中
* 3) HasetSet就是HashMap鍵的集合
* 4) 存儲在HashSet中的元素, 需要重寫equals()/hashCode()方法

 

2 TreeSet

         TreeSet實現了SortedSet接口,可以對集合中的元素自然排序, 要求元素必須是可比較的

1)       在TreeSet構造方法中指定Comparator比較器

2)       如果沒有Comparator比較器,元素的類實現Comparable接口

 

* TreeSet
*  1)TreeSet集合可以對元素排序, 要求元素必須是可比較的
*         (1)在構造方法中指定Comparator比較器
*         (2)如果沒有Comparator,元素的類需要實現Comparable接口
*      TreeSet是先選擇Comparator, 在沒有Comparator的情況下,再找Comaprable
* 2)TreeSet底層是TreeMap    
* 3)向TreeSet添加元素就是把元素作為鍵添加到底層的TreeMap中       
* 4)TreeSet就是TreeMap鍵的集合   

 

TreeSet

可以對元素排序,要求元素必須是可以比較的。

TreeSet是先選擇Comparator,沒有Comparator再選擇

Comparable。

TreeSet的底層是TreeMap

 

TreeSet如果比較兩個元素相同,只能存在一個。

要非常注意,比較方法。TreeSet集合根據Comparator/Comparable的比較結果是否為0,來判斷元素是否為同一個元素的。

==================================

3.5 Collection小結

Collection單個存儲

基本操作:

add(o),   remove(o),  contains(o),  size(), 

iterator()    hasNext(),  next(), remove()

----List 

特點:

有序,存儲順序與添加順序一樣

可重復,可以存儲重復的數據

為每個元素指定一個索引值

新增的操作:

add(inex, o ), remove(index), get(index), set(index, newValue)

sort(Comparator)

--------ArrayList

底層是數組, 訪問快,添加刪除慢

初始化容量:10

擴容: 1.5 倍

--------Vector

底層是數組,  它是線程安全的, ArrayList不是線程安全的

初始化容量: 10

擴容: 2倍

--------LinkedList

底層是雙向鏈表, 添加/刪除效率高,訪問慢

新增的操作:

addFirst(o) / addLast(o)removeFirst()/removeLast()

getFirst()/getLast()

push(o)/pop()

offer(o)/poll()

*******應用場景***************************************************

存儲可以重復的數據選擇List集合

如果以查詢訪問為主,選擇ArrayList

如果頻繁的進行添加/刪除操作,選LinkedList

如果開發多線程程序,選擇juc包中的CopyOnWriterArrayList

-------注意------------------------------------------------------------------------------------------------

List集合,在contains(o), remove(o)操作時,需要比較元素,調用equals()方法

如果在List存儲自定義類型數據,需要重寫equals()/hashCode()

 

----Set

特點:

無序:存儲順序與添加順序可能不一樣

不可重復,存儲的數據不允許重復

--------HashSet

底層是HashMap

向HashSet添加元素就是把該元素作為鍵添加到底層的HashMap中

HashSet就是HashMap鍵的集合

--------TreeSet

TreeSet實現了SortedSet接口,可以對元素自然排序,要求元素必須 是可比較的

(1)在構造方法中指定Comaparator比較器

(2)沒有Comaprator,需要讓元素的類實現Comaparable接口

TreeSet是先選擇Comparator,在沒有Comparator的情況下,再選擇Comparable

TreeSet底層是TreeMap

向TreeSet添加元素就是把該元素作為鍵添加到底層的TreeMap中

TreeSet就是TreeMap鍵的集合

******應用場景*******************************************************

如果存儲不重復的元素使用Set集合

如果不需要排序就使用HashSet

如果需要排序就選擇TreeSet

-----注意--------------------------------------------------------------------------------------------------

HashSet中的元素需要重寫equals()/hashCode()方法

TreeSet集合中判斷是否相同的元素, 根據Comparator/Comparable比較結果是否為0來判斷

 ===========================================

Map是以鍵值對存儲數據

如<員工姓名,工資>,  <學生姓名,成績>…

 -----------------------------------------------------

void

clear() 清空Map中所有的鍵值對.

boolean

containsKey(Object key) 判斷Map中的鍵是否包含指定的key

boolean

containsValue(Object value) 判斷Map中的值是否包含指定的value

Set<Map.Entry<K,V>>

entrySet() 返回所有Entry的集合, 一個<鍵,值>對就是一個Entry

boolean

equals(Object o)

default void

forEach(BiConsumer<? super K,? super V> action)

V

get(Object key) 返回鍵key對應的value值

boolean

isEmpty() 判斷Map是否為空

Set<K>

keySet() 返回所有鍵的集合

V

put(K key, V value) 向Map中添加<key,value>鍵值對

void

putAll(Map<? extends K,? extends V> m) 把參數集合m中的鍵值對都添加到當前Map中

V

remove(Object key) 刪除鍵與key匹配的鍵值對

default boolean

remove(Object key, Object value)

default V

replace(K key, V value) 把key的值使用value替換

int

size() 返回鍵值對的數量.

Collection<V>

values() 返回所有值的集合

 

HashMap工作原理圖:

獲取元素圖:

 HashMap

*  1)底層是哈希表,哈希表是一個數組,數組的每個元素是一個單向鏈表,數組元素實際存儲的是單向鏈表第一個結點的引用
*  2)默認初始化容量: 16
*  3)默認加載因子: 0.75, 當鍵值對的數量大於   容量 * 加載因子時, 數組擴容
*  4)擴容:2倍
*  5)HashMap的鍵與值都可以為null
*  6)在定義Hashmap時,可以指定初始化容量,系統會自動調整為2的冪次方,即把17~31之間的數調整為32, 把33~63之間的數調整為64
*      為了能夠快速計算數組的下標

-------------------------------

 HashTable

*  1)底層是哈希表, 哈希表就是一個數組,數組的元素是一個單向鏈表,數組元素實際存儲的是單向鏈表第一個結點的引用
*  2)默認初始化容量: 11
*  3)加載因子: 0.75
*  4)擴容:2倍 + 1
*  5)HashTable的鍵與值都不能為null
*  6)在定義時可以指定初始化容量, 不會調整大小
*  7) HashTable是線程安全的, HashMap不是線程安全的

--------------------------------------------------------------

Properties

         Properties繼承了HashTable

         鍵與值都是String字符串

         經常用於設置/讀取系統屬性值

         常用 方法:

                   setProperty(屬性名, 屬性值)

                   getProperty(屬性名)

-----------------------------------------------------

TreeMap

* TreeMap實現了SortedMap接口,可以根據鍵自然排序, 要求鍵必須是可比較的
*      1)在構造方法中指定Comparator比較器
*      2)沒有Comparator時,鍵要實現Comparable接口
* 對於TreeMap來說,先判斷是否有Comparator,有的話就按Comparator比較; 如果沒有Comaparator,系統要查看鍵是否實現了Comparable接口
* 對於程序員來說,一般情況下通過Comparable定義一個默認的比較規則(絕大多數使用的排序規則), 通過Comparator可以定義很多不同的排序規則

 

TreeMap是根據二叉樹原理實現排序的

 

二叉樹原理圖示例:

-----------------------------------------------------------------------------------------

Map小結

Map是按<鍵,值>對的形式存儲數據

         基本操作:

                   put(k,v)              remove(k)         remove(k,v)

                  containsKey(k)          containsValue(v)                get(k)        size()

                   keySet()             values()             entrySet()

                   replace( k , v)

---- HashMap

         底層是哈希表(散列表), 哈希表是一個數組,數組的每個元素是一個單向鏈表,數組元素其實存儲的是單向鏈表的第一個結點的引用

         初始化容量: 16

         擴容: 2倍

         鍵與值可以為null

         指定初始化容量,系統會調整為2的冪次方

----HashTable

         底層是哈希表(散列表), 它是線程安全的,HashMap不是線程安全的

         初始化容量: 11

         擴容: 2倍+1

         鍵與值 不 可以為null

         指定初始化容量,系統不調整

         -------- Properties

                   繼承了HashTable,

                   鍵與值都是String字符串

                   經常用來設置/讀取系統屬性

                   一般把屬性保存在配置文件中, 可以通過Properties讀取

----TreeMap

         實現了SortedMap接口,可以根據鍵自然排序, 要求鍵必須是可比較的

1)       在構造方法中指定Comparator比較器

2)       沒有Comparator時, 鍵要實現Comparable接口

對於 TreeMap來說,先選擇Comparator,

         對於 開發人員來說,一般讓鍵實現Comparable接口定義一個默認的比較規則,通過Comparator可以定義其他不同的比較規則

         TreeMap的鍵是根據紅黑樹排序的,紅黑樹是一種自平衡二叉樹

 

*****應用場景**********************************************************

         如果不需要根據鍵排序選擇HashMap

         如果需要鍵排序,選擇TreeMap

         開發多線程程序,一般不使用HashTable, 使用juc包中的ConcurrentHashMap,如果要根據鍵排序就使用juc包中的ConcurrentSkipListMap.  ConcurrentHashMap采用分段鎖協議,默認分為16段鎖,並發效率高.

        

--------注意------------------------------------------------------------------------------------

         HashMap,HashTable的鍵需要重寫equals()/hashCode()

         TreeMap的鍵是根據Comparator/Comparable的比較結果是否為0來判斷是否相同的鍵

 


免責聲明!

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



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