Java集合框架體系
ArrayList底層的實現(xiàn)原理
初始化后ArrayList添加元素的步驟
首先計算數(shù)組的容量,如果當(dāng)前數(shù)組已使用長度+1后的大于當(dāng)前的數(shù)組長度,則調(diào)用grow方法擴容(原來的1.5倍),確保新增的數(shù)據(jù)有地方存儲之后,則添加元素到size的位置上。返回添加成功布爾值。
ArrayList list=new ArrayList(10)中的list擴容幾次
數(shù)組與List之間的轉(zhuǎn)換
用Arrays.asList轉(zhuǎn)List后,如果修改了數(shù)組內(nèi)容,list受影響嗎List用toArray轉(zhuǎn)數(shù)組后,如果修改了List內(nèi)容,數(shù)組受影響嗎?
用Arrays.asList轉(zhuǎn)List后,如果修改了數(shù)組內(nèi)容,list會受影響,因為在集合的構(gòu)造器中,數(shù)組和List集合指向同一個地址。
List用toArray轉(zhuǎn)數(shù)組后,如果修改了List內(nèi)容,數(shù)組不受影響,因為底層他是數(shù)組的拷貝,跟原來的元素就沒關(guān)系了。
鏈表
單向鏈表和雙向鏈表的區(qū)別
單向鏈表只有一個方向,結(jié)點只有后繼指針next。
雙向鏈表有兩個方向,結(jié)點有后繼指針next和前驅(qū)指針prev。
鏈表操作數(shù)據(jù)的時間復(fù)雜度多少
ArrayList和LinkedList的區(qū)別是什么
1、底層數(shù)據(jù)結(jié)構(gòu):ArrayList是動態(tài)數(shù)組實現(xiàn)的,更節(jié)省空間,LinkedList是雙向鏈表實現(xiàn)的,更占用內(nèi)存。
2、操作數(shù)據(jù)的效率:
查找效率,LinkedList的時間復(fù)雜度是O(n),對于ArrayList,給定下標的時間復(fù)雜度是O(1),下標未知的時間復(fù)雜度是O(n)。
插入刪除效率,對于LinkedList,在首尾的效率為O(1),其他位置是O(n),對于ArrayList,首部的效率為O(1),其他位置是O(n)。
3、線程安全:
ArrayList和LinkedList都不是線程安全的。
有兩種方法使其線程安全:
第一種:在方法內(nèi)部使用,局部變量則是線程安全的。
第二種:將其轉(zhuǎn)換為線程安全的集合。
HashMap常用api
mp.put("one",1); //存放鍵值對
mp.get("one"); //通過鍵取值,輸出 1
mp.containsKey("one")); //HashMap中是否包含該鍵
mp.containsValue(1)); //HashMap中是否包含該值
mp.isEmpty()); //判斷是否為空
mp.size()); //輸出 HasMap 的長度
mp.values());//輸出所有值
mp.keySet());//輸出所有鍵
mp.entrySet());//輸出所有鍵和值
HashMap實現(xiàn)原理
HashMap的jdk1.7和jdk1.8的區(qū)別
jdk1.7的HashMap采用數(shù)組加鏈表的方式。jdk1.8的HashMap采用數(shù)組加鏈表加紅黑樹的方式。當(dāng)數(shù)組長度大于64并且鏈表長度大于8時,鏈表轉(zhuǎn)換為紅黑樹。
HashMap的put方法的具體流程
-
首先,
put
方法接收兩個參數(shù):鍵(key)和值(value)。根據(jù)鍵的哈希值,確定要將鍵值對插入到HashMap的哪個桶(bucket)中。 -
如果要插入的桶為空,直接將鍵值對作為新的桶節(jié)點插入該位置即可。
-
如果要插入的桶不為空,即發(fā)生了哈希沖突,根據(jù)鍵的哈希值和equals方法進行比較來判斷鍵是否已經(jīng)存在于桶中。
-
如果存在相同的鍵,則更新對應(yīng)鍵的值為新的值。
-
如果不存在相同的鍵,則將新的鍵值對作為桶的新節(jié)點插入到鏈表的頭部或紅黑樹中。
-
插入完成后,如果數(shù)組長度大于64并且鏈表長度大于8時,鏈表轉(zhuǎn)換為紅黑樹,以提高查詢效率。
-
最后,如果插入操作導(dǎo)致HashMap的大小超過了負載因子(通常為0.75)乘以容量的閾值,就會觸發(fā)擴容操作,重新調(diào)整HashMap的容量,以保持較低的哈希沖突率。
HashMap的擴容機制
-
當(dāng)HashMap中存儲的元素數(shù)量達到負載因子(load factor)乘以當(dāng)前容量的閾值時,就會觸發(fā)擴容操作。擴容時,HashMap會創(chuàng)建一個新的桶數(shù)組,其容量是舊數(shù)組的兩倍。
-
接下來,HashMap會遍歷原來的桶數(shù)組中的每個桶,并將桶中的元素重新分配到新的桶數(shù)組中的相應(yīng)位置。重新分配的過程會根據(jù)鍵的哈希值重新計算桶的位置。
-
在重新分配元素的過程中,如果原來的桶中只有一個元素,那么該元素可以直接放入新的桶中。如果原來的桶中有多個元素,會涉及到鏈表或紅黑樹的重組操作,以保持元素在新的桶中的相對順序。文章來源:http://www.zghlxwxcb.cn/news/detail-545253.html
-
擴容完成后,HashMap的容量就會更新為新的容量,并且新的桶數(shù)組會取代原來的桶數(shù)組成為HashMap的內(nèi)部存儲結(jié)構(gòu)。文章來源地址http://www.zghlxwxcb.cn/news/detail-545253.html
到了這里,關(guān)于集合List和Map的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!