日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

[Java复习02] 集合框架 Collection

發布時間:2025/3/15 java 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Java复习02] 集合框架 Collection 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Q1 Collection

java的集合以及集合之間的繼承關系?

數組和鏈表的區別?

固定長度,連續內存,不能擴展,隨機訪問快,插入刪除慢。鏈表相反

?

List, Set, Map的區別?

List,Set繼承Collection接口

List可以放重復數據,Set不能,Map是k-v對

?

List和Map的實現方式以及存儲方式?

ArrayList: 底層動態數組。隨機訪問快,增刪慢,線程不安全。

擴容導致數組復制,批量刪除會導致找兩個集合交集,效率低。

LinkedList: 底層鏈表(雙向列表)。增刪快,查找慢,線程不安全。

遍歷: 1.普通for循環,元素越多后面越慢 2.迭代器:每次訪問,用游標記錄當前位置

根據下標獲取node,會根據index處于前半段還是后半段進行折半,提升效率。

HashMap: 散列表, 數組+鏈表+紅黑樹(JDK1.8) 默認16, 擴容2的冪

?

Q2 List

ArrayList實現原理?

動態數組,默認10,擴容grow(minCapacity),增加到1.5倍

ArrayList和LinkedList的區別,以及應用場景?

1.動態數組和雙向隊列鏈表。

2.ArrayList用for循環遍歷優于迭代器,LinkedList則相反。

3.ArrayList在數組任意位置插入,或導致該位置后面元素重新排列,效率相對低。

LinkedList增刪只需移動指針,時間效率高。不需擴容,空間效率也高。但隨機訪問元素時間效率低。

?

鏈表翻轉? 手寫鏈表逆序代碼?

方法1:遞歸: 從最后一個Node開始,在彈棧的過程中將指針順序置換。

1 public class Node { 2 3 private String data; 4 5 private Node next; 6 7 // Getter() & Setter() 8 9 } 10 11 public Node reverse(Node head) { 12 13 if (head == null || head.getNext() == null) { 14 15 return head; 16 17 } 18 19 Node temp = head.getNext(); 20 21 Node newHead = reverse(head.getNext()); 22 23 temp.setNext(head); 24 25 head.setNext(null); 26 27 return newHead; 28 29 } View Code

解析:遞歸本質是系統壓棧,壓棧時保留現場。

例子:A->B->C->D

程序先壓棧,到達倒數第2個節點時(C),C的next為D, reverse(D)返回D。

接著就是彈棧過程,執行temp.setNext(head); 此時temp是D, head是C,temp的next設置為C, 就是D->C, 不過head是C,還有next是D,這句會形成環(D->C->D)。需要下一句head.setNext(null);把C的next指針斷開,形成D->C(C.next->null)的反轉最后2個節點。返回新鏈表的頭結點newHead,也就是D。后面進行相同操作,最終完成整個鏈表的反轉。

方法2:遍歷: 在鏈表遍歷的過程中將指針順序置換。

1 public Node traverseReverse(Node head) { 2 3 Node pre = null; 4 5 Node next; 6 7 while(head != null) { 8 9 next = head.getNext(); 10 11 head.setNext(pre); 12 13 pre = head; 14 15 head = next; 16 17 } 18 19 return pre; 20 21 } View Code

解析:在head點遍歷, 第一次時為A節點,next為B節點,head(A)節點的next設置為前一個節點pre(當前為null),把head節點賦給pre,pre為A節點,再把next節點(B)賦給head。

進行下一次循環,head為B節點,pre為A節點,head(B)節點的next設置為前一個節點pre(A),形成B->A,再復制給pre。Head移動到下一個節點。依次繼續循環。。。

?

判斷一個單鏈表是否有環?如果有環找出環的起點,以及環的長度?

方法一,窮舉遍歷。用新節點ID和此節點之前所有節點ID依次比較,如發現存在相同ID,則有環。時間復雜度O(N*N), 沒有額外空間,空間復雜度O(1)

方法二,哈希表HashSet緩存。如發現存在相同節點,則說明有環。時間復雜度O(N),空間復雜度O(N)。

方法三,快慢指針。快指針移動2個節點,慢指針移動1個節點。然后比較2個指針節點是否相同。相同有環。

?

Q3 Map

HashMap數據結構,實現原理?put, get, resize等工作原理?

HashMap存儲key-value鍵值對。Key和value都允許為null。Key重復會被覆蓋,value可以重復。無序。非線程安全。

JDK1.7 數組+鏈表,JDK1.8 數組+鏈表+紅黑樹。

默認集合容量16,默認填充因子0.75,鏈表長度2的冪,鏈表長度>8,集合容量>64,鏈表轉紅黑樹,當紅黑樹節點個數小于6,又會轉化為鏈表。新增紅黑樹作為底層數據結構,在數據量較大且哈希碰撞較多時,提高索引效率。

HashMap實現原理:

底層table,是一個Node<K,V>的數組,當添加一個元素時,先計算key的hash值,以此確定插入table的位置。如果同一個hash的元素已經放入在table的同一位置,則添加到該元素的后面,形成鏈表。當鏈表過長時,轉化為紅黑樹,提高查詢效率。

計算數組table索引的方法:(算hash是1,2步,第3步算table索引)

1. 取 hashCode 值: h = key.hashCode()

2. 高位參與運算:h ^ (h>>>16)

? ? ?好處:右位移16位,正好是32bit的一半,高半區和低半區做異或,就是為了混合原始哈希碼的高位和低位,以此來加大低位的隨機性。

3. 取模運算:(table.length - 1) & hash

? ? 為什么用&,不用%? 因為lenth =?2n 時,X % length = X & (length - 1),?& 的效率比 % 高很多。

Put()方法工作原理:

① 判斷鍵值對數組 table 是否為空或為null,否則執行resize()進行擴容;

② 根據鍵值key計算hash值得到插入的數組索引i,如果table[i]==null,直接新建節點添加,轉向⑥,如果table[i]不為空,轉向③;

③ 判斷table[i]的首個元素是否和key一樣,如果相同直接覆蓋value,否則轉向④,這里的相同指的是hashCode以及equals;

④ 判斷table[i] 是否為treeNode,即table[i] 是否是紅黑樹,如果是紅黑樹,則直接在樹中插入鍵值對,否則轉向⑤;

⑤ 遍歷table[i],判斷鏈表長度是否大于8,大于8的話把鏈表轉換為紅黑樹(treeifyBin),在紅黑樹中執行插入操作,否則進行鏈表的插入操作;遍歷過程中若發現key已經存在直接覆蓋value即可;

⑥ 插入成功后,判斷實際存在的鍵值對數量size是否超過了最大容量threshold,如果超過,進行擴容resize()。

⑦ 如果新插入的key不存在,則返回null,如果新插入的key存在,則返回原key對應的value值(注意新插入的value會覆蓋原value值)

Resize擴容的工作原理:

1.計算新桶數組的容量 newCap

2.新閥值 newThr

3. 將原集合的元素重新映射到新集合中

3.1 既不是鏈表又不是紅黑樹,直接插入

3.2 紅黑樹,調用split方法重新分配

3.3.鏈表,不用像JDK1.7重新計算hash,只看原hash值新增的bit是1還是0,是0則索引不變,是1則索引變為”原索引+oldCap”

Get工作原理:

1. 通過key的hash計算table索引位置:hash & (length - 1)。

2. 檢查數組該位置節點是否剛好是要找的元素,如果是則返回,如果不是則第3步。

3. 判斷該元素時否TreeNode, 如果是則用紅黑樹TreeNode的方法find查找元素。如果不是則第4步。

4.遍歷鏈表,找到相等(==或equals)的key。

HashMap線程不安全實際會如何體現?

1. 多線程同時Put元素,假設key發生碰撞(hash相同),這個兩個key會添加到數組同一個位置,其中一個線程的數據被覆蓋。

2. 多線程同時檢查到需要擴容,都在重新計算元素位置及復制數據,最終只有一個線程擴容后的數組會賦值給table,其他線程會丟失。

?

HashMap如何變成線程安全?

1. Collections.synchronizeMap();

2. ConcurrentHashMap(java.util.concurrent). JDK1.5+

?

為什么String, Integer這樣的wrapper類適合作為鍵?

String是不可變的,所以他創建的時候hashcode就被緩存了,不需要重新計算。還有字符串的處理速度要快過其他的鍵對象。

Integer的hashcode返回本身的值,也是不變的。

?

重新調整HashMap的大小存在什么問題?

JDK1.7多線程會產生競爭條件(race condition)。

兩個線程同時嘗試調整大小。調整過程,存儲鏈表中元素次序會反過來,放在頭部不是尾部,是為了避免尾部遍歷(tail traversing)。如果競爭條件發生,就產生死循環。

HashMap中如何解決碰撞問題?如何減少碰撞?

在調用Put和get方法時,首先通過key的hashcode方法計算哈希桶的位置在存儲對象。當獲取對象時,通過鍵對象的equals()方法找到正確的鍵值對。

HashMap使用鏈表來解決碰撞問題,當碰撞發生了,對象將會存儲在鏈表的下一個節點。

減少碰撞:1. 使用不可變,聲明為final的對象,比如String 作為Key。

2.采用合適的equals()和hashCode()方法,將會減少碰撞發生,提高效率。String已經重寫了equals和hashcode方法,很適合作為HashMap的Key。

?

LinkedHashMap和TreeMap是如何保證它的順序的?

LinkedHashMap繼承HashMap.Node的屬性,額外增加了before, after用于指向前一個Entry和后一個Entry,在哈希表繼承上構成雙向鏈表。可以按照插入的順序排序的Map。

TreeMap是按照Key的自然順序或者Comparator的順序進行排序。

LinkedHashMap是雙向鏈表,TreeMap是紅黑樹。

它們兩個哪個的有序實現比較好?

如果要按自然順序或自定義順序遍歷鍵,那么TreeMap實現更好。如果需要輸出的順序和輸入的相同,那么用LinkedHashMap實現更好。

?

附上Collection思維導圖

Collection思維導圖Github地址:

https://github.com/channingy/JavaSummary/

參考資料:

https://www.cnblogs.com/ysocean/p/8657850.html

https://www.cnblogs.com/ysocean/p/8711071.html

https://www.cnblogs.com/litexy/p/9744241.html

轉載于:https://www.cnblogs.com/fyql/p/11027148.html

總結

以上是生活随笔為你收集整理的[Java复习02] 集合框架 Collection的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人免费毛片网 | 欧洲亚洲女同hd | 粉嫩一区二区三区 | 成人免费入口 | 天堂资源最新在线 | 69性影院 | 成人免费看片&#39; | 中文理论片 | 国产午夜精品一区二区三区四区 | 日本吃奶摸下激烈网站动漫 | 亚洲av无码一区二区乱子伦 | 91丝袜一区二区三区 | 久热免费视频 | 爱爱福利社 | 91高跟黑色丝袜呻吟动态图 | 91精品国产91久久久久青草 | 亚洲福利在线视频 | 天堂va蜜桃一区 | 亚洲精品推荐 | 亚洲av电影一区 | 日本强好片久久久久久aaa | 福利视频99 | 欧美日韩在线成人 | 亚洲天堂精品在线观看 | 丁香六月五月婷婷 | 亚洲色视频 | 涩涩涩综合 | 午夜国产视频 | 狂野欧美性猛交xxxx巴西 | 国产高清久久久 | 日本成人久久 | 国产欧美日韩精品在线观看 | 丝瓜色版 | 日韩精品在线观看AV | 一区二区三区视频在线播放 | 日韩午夜免费 | 一色av | 成人久久电影 | 伊人狠狠操 | 日韩淫视频 | 亚洲aⅴ| 国模杨依粉嫩蝴蝶150p | 中国女人av | 偷拍xxxx| 四季av在线一区二区三区 | 在线播放波多野结衣 | 肥臀浪妇太爽了快点再快点 | 久久盗摄| 免费看的av网站 | 性色av免费 | 精品国产一区二区三区性色av | 色久天| 亚洲一区二区精品在线 | 综合九九| 久久免费在线 | 国语对白一区二区三区 | 午夜成人在线视频 | 免费美女毛片 | 黄色视屏在线看 | 日韩欧美中文字幕一区 | 69精品人妻一区二区三区 | 国产中文字幕二区 | www四虎影院| 久久久久久久久久久久久久久 | 国产精品成人av久久 | 日韩视频成人 | 精品人伦一区二区三区 | www.九色.com| 亚洲综合五区 | 亚洲熟妇av一区二区三区漫画 | av噜噜在线 | 91成人久久| 加勒比波多野结衣 | 亚洲天堂自拍偷拍 | 寡妇av | 91桃色免费视频 | 三女警花合力承欢猎艳都市h | 超碰97av| 欧美91看片特黄aaaa | 久久无码人妻丰满熟妇区毛片 | 神秘马戏团在线观看免费高清中文 | 少妇肥臀大白屁股高清 | 爱爱网视频 | 成人在线免费播放 | 日本xxxx免费 | 丰满熟妇人妻中文字幕 | 久久久久国产精品夜夜夜夜夜 | 一级黄色免费视频 | 性欧美一区二区三区 | 中国少妇做爰全过程毛片 | 干干干日日日 | 中文字幕在线视频观看 | 黄色影音| 毛片中文字幕 | 黄片毛片一级 | va在线播放 | ass日本寡妇pics | 日韩av电影手机在线观看 | 日日狠狠久久偷偷四色综合免费 |