集合List Set Map詳解

2021-09-02 23:53:37 字數 2861 閱讀 4180

list、set、map是否繼承自collection介面?

list、set是map不是,list是線性結構的容器,底層使用陣列實現,使用於按數值索引訪問元素的情形;set儲存零散的元素且不允許有重複的元素(類似數學中的集合);map儲存的是key-value鍵值對

闡述arraylist、vector、linkedlist的儲存效能和特性?

共同點:arraylist、linkedlist、vector都是list介面的實現類,儲存的資料都是有序的、可重複的。

區別:

arraylist:作為list的主要實現類;底層使用陣列;效率高;執行緒不安全的;

為什麼arraylist執行緒不安全?

arraylist在增加元素時進行兩步操作,1、判斷size是否能放下add的元素;2、向底層陣列中新增元素;因此多個執行緒同時向list中新增元素會出現  陣列越界的異常;或者a執行緒add的值覆蓋了b執行緒add的值;

執行緒不安全的解決方法?

工具類collections中定義 了 synchronizedlist(list list)方法,將此arraylist轉化為執行緒安全的;以讀為主的場景中使  copyonwritearraylist解決執行緒安全問題;copyonwrite容器即寫時複製的容器。通俗的理解是當我們往乙個容器新增元素的時候,不直接往當前容器新增,而是先將當前容器進行copy,複製出乙個新的容器,然後新的容器裡新增元素,新增完元素之後,再將原容器的引用指向新的容器。這樣做的好處是我們可以對copyonwrite容器進行併發的讀,而不需要加鎖,因為當前容器不會新增任何元素。所以copyonwrite容器也是一種讀寫分離的思想,讀和寫不同的容器。

copyonwrite併發容器用於讀多寫少的併發場景。比如白名單,黑名單,商品類目的訪問和更新場景,假如我們有乙個搜尋**,使用者在這個**的搜尋框中,輸入關鍵字搜尋內容,但是某些關鍵字不允許被搜尋。這些不能被搜尋的關鍵字會被放在乙個黑名單當中,黑名單每天晚上更新一次。當使用者搜尋時,會檢查當前關鍵字在不在黑名單當中,如果在,則提示不能搜尋。copyonwrite(copyonwritelist、copyonwritemap)容器有很多優點,但是同時也存在兩個問題,即記憶體占用問題(add資料需要重新複製乙份) 和 資料一致性問題(在add過程中讀取的資料是舊資料)。所以在開發的時候需要注意一下。

linkedlist:

底層使用雙向鍊錶;對於頻繁的插入、刪除操作,我們建議使用此類,因為效率高;

vector:

list的古老實現類;底層使用陣列實現;執行緒安全的,效率低;

arraylist的底層建立方式:

arraylist 使用空參構造器建立物件時: jdk7.0版本,底層預設建立10個元素的陣列;jdk8.0底層預設建立空陣列(當向集合新增元素時將空陣列改為10個元素的陣列;新增的元素一旦超出了底層陣列的長度,就需要擴容,預設擴容為原來的1.5倍,同時,需要將原有陣列中的元素複製到新的陣列中(賦值方法:arrays.copyof)。所以為了避免底層頻繁的擴容,在已知元素數量的情況下,使用有參構造器建立arraylist物件,指定其初始化長度;

hashmap、linkedhashmap、treemap、hashtable異同?

hashmap:map的主要實現類;執行緒不安全的,效率高;可以儲存null的key和value(儲存結構:jdk7.0 陣列+鍊錶; jdk8.0 陣列+鍊錶+紅黑樹;解決hashmap執行緒不安全:copyonwritemap、concurrenthashmap

concurrenthashmap:底層使用hashmap +segment (段、部分、分割)實現,預設16個segment,hashmap的總容量平均分配到每個segment,插入資料時,首先獲取對每個segment的操作許可權;如果沒有共享資源,會造成效能浪費;

linkedhashmap:hashmap的子類,可以按照新增的順序遍歷。對於頻繁的遍歷效率較高。(在hashmap儲存結構的基礎上,使用了一對雙向鍊錶來記錄新增元素的順序)

treemap:可以按照key指定的屬性進行排序。底層實現:紅黑樹

hashtable:map的古老實現類;執行緒安全的,效率低;不可以儲存null的key和value

properties:hashtable的子類,常常用來處理屬性檔案。其key和value都是string型

hashmap map = new hashmap();/底層建立了長度為16的entry陣列,載入因子是0.75,向hashmap中新增元素,需要首先計算 新增元素 的key的雜湊值 (根據key所在類的hashcode()計算得到) ,此雜湊值經過處理以後,得到在底層entry陣列中要儲存的位置i. 如果位置i上沒元素,則直接新增成功。如果位置i上已經存在元素(或還有以鍊錶存在的entry3,entry4),則需要通過迴圈的方法,依次比較 新增元素 的key和其他entry的key是否equals.如果返回值為true.則使用 新增元素 的value去替換equals為true的entry的value.如果遍歷一遍以後,發現所有的equals返回都為false,則 新增元素 仍可新增成功。新增元素 指向原來的entry元素。如果新增元素的長度 >= default_initial_capacity * default_load_factor (預設值為12)且新要新增的陣列位置不為null的情況下,就進行擴容。預設擴容為原長度的2倍,將原來的資料複製到新的陣列中。

集合 list set map 彙總

list 是乙個有序的集合,可以包含重複的元素,提供了按索引訪問的方式,它繼承collection。list有兩個重要的實現類 arraylist和linkedlist 這兩個都是執行緒不安全的,vector和copyonwritearraylist是執行緒安全的 arraylist 可以看作是能夠...

Dart集合型別List Set Map

常用屬性 length 長度 reverse 翻轉,注意翻轉之後的返回值不是list型別的,需要加tolist轉換為list型別 isempty 是否為空 isnotempty 是否不為空 常用方法 add 增加 addall 拼接陣列 indexof 查詢 傳入具體值 注意 查詢不到返回 1 re...

java 集合(list set map)的特點

今天趁有空特意從網上整理資料方便日後回憶。一 list 有順序以線性方式儲存,可以存放重複物件 執行緒安全方法 list list collections.synchronizedlist new linkedlist linkedlist 雙向鍊錶實現儲存 索引資料慢插入數度較快 執行緒不安全 比...