java 集合 幾種集合的區別及適用場景

2021-08-29 22:41:42 字數 1684 閱讀 1878

後台開發工作中經常遇到一些使用集合的場景,幾種集合的優缺點又老是記不住,所以寫了這篇部落格。

首先大的集合分為:list,set,map三種,其中list與set是繼承自collection,而map不是。

list與set的區別:list中的元素有存放順序,並且可以存放重複元素,檢索效率高,插入刪除效率低,set沒有存放順序,而且不可以存放重複元素,後來的元素會把前面重複的元素替換掉,檢索效率低,插入刪除效率高。(set儲存位置是由它的hashcode碼決定的,所以它儲存的物件必須有equals()方法,而且set遍歷只能用迭代,因為它沒有下標。)

1、最常用的集合:arraylist

本人比較懶,最常用的就是最簡單的集合,因為用起來感覺比較方便。

特點:arraylist集合中元素儲存的位置是連續的,所以查詢起來會比較快捷,但是執行插入刪除操作會比較麻煩一點,會引起其他元素位置的變化。

注意:list中儲存的是物件的引用,而不是物件本身。如果不清楚這一點會在這裡有個坑,例如:

有人為了節省優化**,節省虛擬機器記憶體會這麼寫**:

list> list=new arraylist<>();

listlist2=new arraylist<>();

for(int i=0;i<10;i++){

list2.add(""+i);    

list.add(list2);

list2.clear();

這樣寫雖然可以乙個物件重複使用,但是,list儲存的是物件的引用,當list2.clear();的時候,list中的list2也會clear,這樣最後得到的就只能是一堆空的集合了。

2、與最常用集合相反的集合:linkedlist

linkedlist與arraylist是互補的,所以arraylist的優點就是linkedlist的缺點,arraylist的缺點就是linkedlist的優點。

特點:linkedlist中元素位置是任意的,所以執行插入刪除操作效率較高,查詢效率較低。

3、與一般集合都相反的集合:vector

為什麼說它與一般集合都相反呢?因為它是一種老的動態陣列,很多方法都用synchonized修飾,所以它是執行緒安全得,而一般集合是執行緒不安全得。

特點:多個執行緒同時訪問不會發生不確定的結果,但是它的效率會比較低,如果要考慮執行緒安全的話可以用它。

4、set中最常用的集合:hashset

在用set集合的時候我幾乎用的都是hashset,hashset是使用hash表實現的,集合裡面的元素是無序得,可以有null值,但是不能有重複元素。

特點:因為相同的元素具有相同的hashcode,所以不能有重複元素

5、set中第二常用的集合:treeset

treeset是用二叉樹結構實現的集合

特點:集合中的元素是有順序得,不允許放入null,同樣不能放入重複元素。

6、第二常用的集合:hashmap

經常遇到需要使用鍵值對儲存的場景,而hashmap是用得最多的一種鍵值對儲存的集合。

特點:hashmap允許空鍵值,並且它是非執行緒安全的,所以插入、刪除和定位元素會比較快。

7、一些不太常用的map集合:treemap,hashtable

treemap是基於紅黑樹實現的,適用於按自然順序火茲定於順序遍歷key。

hashtable是基於hashcode實現的,但它是執行緒安全的,所以會比hashmap效率低,而且不允許null值。

參考:

java所有集合的區別

1.hashmap去掉了hashtable 的contains方法,但是加上了containsvalue 和containskey 方法。2.hashtable同步的,而hashmap是非同步的,效率上逼hashtable要高。3.hashmap允許空鍵值,而hashtable不允許。vector和...

java之List集合與Set集合的區別(1)

專案中我用到的list集合主要是arraylist以及hashset,他們全都是繼承自collection介面 list底層就是陣列 也就是說可以根據下標來拿到list中的元素 特點是元素有序放入,元素可以有重複,元素可以為null 可以使用for迴圈遍歷,也可以使用迭代器。hashset是基於雜湊...

java常見集合類區別

hashmap 執行緒不安全,key可以為null,不可多執行緒,效率高 hashtable 執行緒安全,key不可以為null,內部的方法基本都經過 synchronized 修飾,效率低下 concurrenthashmap 在hashtable的基礎上進行分割,鎖住分割的一部分而不是整個map...