1. 程式人生 > >Java比較實用的三種集合類

Java比較實用的三種集合類

java集合類

哪三種?

四種集合類對應四個介面
1.map介面,常見的實現有hashmap、treemap、hashtable、concurrenthashmap
2.list介面,常見的實現有arraylist、linkedlist、vector
3.set介面,常見的實現有hashset、linkedhashset、treeset

更多集合類以及更多的分類依據可以看大神的文章一張圖讓你看清Java集合類(Java集合類的總結)

1.map集合類

map介面通用的方法有:
1.map.size(),獲取集合類大小(即map裡存在的鍵值對對映數量)
2.map.values(),獲取集合類所有值,返回型別為Collection
3.map.keySet(),獲取集合類所有key,返回型別為set
4.map.put(key,value),將key-value這對鍵值對存入集合類中
5.map.get(key),獲取key值對應的value,如果對應的values不存在,則返回null
6.map.remove(key),移除key值對應的value
7.map.clear(),清空集合裡全部的鍵值對
8.map.putall(map2),把map2的全部資料複製到map,如果有重複的資料,那麼map2中的資料會覆蓋map的資料
9.jdk1.8新增加了lambda表示式map.forEach((k,v)->{語句}),語句中可以使用k,v形參代表相應的map中的key,value。
更多例子說明請看大神的文章,在參考文獻1

1.1hashmap

hashmap的儲存方式採用陣列加連結串列的形式。最常見的map集合類,執行緒不同步,根據key值直接獲取value,具有很高的訪問速度。
一組鍵值對進來,先計算key的hashcode,然後找到和hashcode對應的陣列下標,因為hash演算法為壓縮演算法,所以不同的key可能會壓縮到相同的下標。如果沒有衝突則順利填入陣列中,如果衝突了這時候就會發生hash碰撞。
發生碰撞後hashmap採用的解決方法就是加上鍊表,在陣列的下標對應的那個格子再加連結串列,當連結串列過多時在新版本里會加自動轉化為紅黑樹。
在這裡插入圖片描述
hashmap剛被建立時陣列有一個初始長度,當陣列被填滿到超過某個閾值時,就會擴大兩倍,保持2的冪次方長度的原因是這樣hash運算時才能最大程度的保持索引分佈均勻

1.2treemap

儲存方式為紅黑樹的方式,按照key值排序,可以支援自定義排序,執行緒不同步。
在插入刪除等操作時代價要比hashmap高,適用於按自然順序或自定義順序取出資料的場景下使用。

1.3hashtable

與hashmap類似,不同之處在於他在同一時刻只支援一個執行緒對他進行操作,所以寫入比hashmap慢,但他保證了執行緒同步。
這個集合類因為太過慢所以基本已經過時了,新版本中可以使用concurrenthashmap替換

1.4concurrenthashmap

concurrenthashmap是由一個個的segment組成,每個segment就是一個hashmap,同時一個segment只能由一個執行緒使用,所以segment的數量就代表了併發的最高數量。保證了部分是同步的就保證了整個集合是同步的。
segment的數量由預設值,也可以自己定義,一開始只會初始化segment[0],後面用到哪個部分才會初始化哪個部分,segment的數目建立後就一直不變了,當某個segment滿了時,只會擴容segment裡裡麵包含的陣列

2.list集合類

list可以用來裝任何東西,是對Collection介面的擴充。
1.list.add(index,element)在index位置新增元素,index可省略
2.list.remove(index)刪除index位置的元素
3.list.set(index,element)修改index位置的元素
4.list.get(index)獲取index位置的元素
5.list.indexOf(element)查詢元素的索引
list.lastIndexOf(element)查詢元素最後一次出現的索引

2.1arraylist

以陣列的形式儲存,動態陣列,執行緒不安全
list最簡單的實現方式,在建立時可以指定儲存的資料型別,也可以不指定。根據構造方法的不同會有不同的擴容情況,
1,使用預設構造方法時,返回空陣列,在第一次新增元素時擴容至預設長度10,之後按照容量的1.5倍擴容
2,使用自定義的觸時容量構造方法,會自動初始化為指定的長度,注意當初始長度過小時,後面幾次擴容速度會非常慢。
3.arraylist也存在最高容量,2的31次方減1,即int的最大值,當超出時丟擲OutOfMemoryError(記憶體溢位)

2.2linkedlist

使用連結串列的形式儲存,常被用做棧,佇列,或雙向佇列使用,非同步
可以快速的插入第一個或最後一個元素,也可以快速取出第一個或最後一個元素。作為連結串列固有的缺點,隨機訪問時效率特別低。
1.linkedlist.getFirst();獲取第一個元素
2.linkedlist.getLast();獲取最後一個元素
3.linkedlist.add(Element);新增元素
4.linkedlist.removeFrirst();刪除第一個元素並返回刪除的元素(同理removeLast)
5.linkedlist.pollFirst();也可達到上面的效果(pollLast)

2.3Vector

和arraylist一樣使用陣列實現,也為動態陣列,與arraylist的不同之處在於vector為執行緒同步的,代價就是訪問比arraylist慢
提供新增、刪除、修改、遍歷、直接訪問等功能

3.Set

set不能儲存重複元素,適用於無序的元素,判斷相等的方法為比較hashcode的值,不能單獨實現,只能用hashset或linkedhashset或treeset等形式實現

3.1hashset

儲存的時候按照hashcode的值排序,對於hashcode相同而equals時卻不同的數,則在陣列的基礎上使用連結串列儲存
add(),

3.2linkedhashset

有序形式的set,怎麼存的就會怎麼取出來(連結串列佇列)

3.3 treeset

另一種形式的有序set,以紅黑樹的形式儲存

寫的比較簡單,有什麼疑問或錯誤歡迎交流2018-12-20

參考文獻

1.java.util.Map——Map集合的常用方法
2.java中map的種類區別及排序詳解(map集合的使用)
3.LinkedList基本用法