容器

List,Set,Map 三者的區(qū)別
List是有序且允許重復(fù)的,內(nèi)部存儲結(jié)構(gòu)是Object數(shù)組,它的實現(xiàn)類有ArrayList,LinkedList,Vector,Vector是線程安全的
Set是無序且不允許重復(fù)的,內(nèi)部是數(shù)組+鏈表,它的實現(xiàn)類有HashSet底層數(shù)據(jù)結(jié)構(gòu)HashMap , LinkedHast數(shù)組+鏈表 TreeSet是可以自動排序的二叉樹
Map是KV鍵值對,是鏈表+紅黑樹,
集合框架底層數(shù)據(jù)結(jié)構(gòu)總結(jié)
ArrayList底層采用Object數(shù)組的方式進行存儲,
LinkedList采用雙向鏈表的方式進行存儲(jdk1.8之前是單向鏈表)(內(nèi)存空間不連續(xù))
Vector:"Object"數(shù)組
HashSet(無序,唯一):基于HashMap實現(xiàn),底層采用HashMap來保存元素
LinkedHashMap:繼承自HashSet,并且內(nèi)部通過LinkedHashMap來實現(xiàn) TreeSet(有序,唯一):紅黑樹(自平衡的排序二叉樹)
HashMap:JDK1.8之前HashMap由數(shù)組+鏈表JDK1.8以后HashMap在解決哈希沖突時(在鏈表長度大于閾值為8)將鏈表轉(zhuǎn)換為紅黑樹
LinkedHashMap繼承自HashMap由數(shù)組和鏈表+紅黑樹組成,另外LinkedHashMap在上面結(jié)構(gòu)的基礎(chǔ)上,增加了一條雙向鏈表 TreeMap:
紅黑樹(自平衡的排序二叉樹)
HashTable采用數(shù)據(jù)結(jié)構(gòu)為哈希表(數(shù)組+鏈表)
有哪些集合是線程不安全的?怎么解決呢?
HashSet,TreeSet,ArrayList,LinkedList,HashMap,TreeMap都是線程不安全的。Collections提供了多個靜態(tài)的方法可以把它們包裝成線程同步的集合,對于Map可以使用ConcurrentHashMap
說一說 ArrayList 的擴容機制吧
第一個元素,數(shù)組容量擴為10 每次擴容之后的容量都會變?yōu)樵瓉淼?.5倍
HashMap 有哪幾種常見的遍歷方式?
1:使用迭代器 2:使用foreach,迭代器的一種簡單形式 (先獲取所有的key;遍歷所有的key;根據(jù)每一個key,獲取對應(yīng)的value值) 3:Entry:類對象遍歷:直接獲取當(dāng)前Map集合的所有KV鍵值對,每一個KV鍵值對都封裝成Entry類型
HashMap的擴容機制:
①:創(chuàng)建時如果不指定容量初始值,HashMap的默認初始大小是16。之后每次擴容,容量變?yōu)樵瓉淼?倍。
②:創(chuàng)建時如果給定了容量大小,HashMap會將其擴充為2的冪次方大小。也就是說HashMap總是使用2的冪作為哈希表的大小。
HashMap,null可以作為鍵,這樣的鍵只可以有一個,可以有一個或者多個鍵的值對應(yīng)為null
底層數(shù)據(jù)結(jié)構(gòu):
JDK1.8以后的HashMap在解決哈希沖突時,當(dāng)鏈表大于閾值,將鏈表轉(zhuǎn)為紅黑樹,以減少搜索時間。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容