java理論知識匯總-集合篇

關(guān)于List虹钮、Set

手畫Collection結(jié)構(gòu)圖(Vector和Stack已經(jīng)廢棄

集合框架圖.png
Collection思維導圖

Collection下集合的類關(guān)鍵詞

  • List 有序廷蓉,可重復集合
  • Set 無序愕把,不可重復集合
  • Queue 先進先出隊列
  • Deque 雙向隊列
  • Array 數(shù)組方式實現(xiàn)嵌灰,內(nèi)存上不連續(xù)
  • Linked 鏈表方式實現(xiàn),內(nèi)存上連續(xù)
  • CopyOnWrite 采用寫入時復制技術(shù)
  • SkipList 采用跳表技術(shù)提高搜索效率
  • Concurrent 非阻塞的方式實現(xiàn)線程安全
  • Blocking 阻塞方式實現(xiàn)線程安全

Collection下哪些是線程安全的础浮?

  • CopyOnWrite系列:CopyOnWriteArrayList帆调、CopyOnWriteArraySet
  • Concurrent系列:ConcurrentLinkedQueue、ConcurrentLinkedDeque豆同、ConcurrentSkipListSet
  • Blocking系列:ArrayBlockingQueue贷帮、LinkedBlockingQueue、LinkedBlockingDeque诱告、DelayQueue撵枢、SynchronousQueue民晒、PriorityBlockingQueue

ArrayList和LinkedList的差異

  • 結(jié)構(gòu)上:ArrayList數(shù)組實現(xiàn),內(nèi)存連續(xù)锄禽,LinkedList 鏈表實現(xiàn)潜必,內(nèi)存不連續(xù)
  • 在隨機訪問上:ArrayList更快
  • 插入/刪除:LinkedList更快

ArrayList是如何擴容的

  • 計算最小需要空間
  • 判斷是否需要擴容
  • 擴容到原來的1.5倍
  • 使用System.arraycopy方法將數(shù)據(jù)復制到新的內(nèi)存空間

ArrayList擴容因子為什么是1.5倍

真實的倍數(shù)為oldCapacity + (oldCapacity >> 1),約等于1.5倍沃但,這么設(shè)計應該是出于位運算性能的考慮磁滚。

fast-fail機制

  • 對集合的每一次增刪操作都會增加modCount的值
  • iterator遍歷集合前會記錄該值
  • 調(diào)用next方法時會校驗該值是否發(fā)生改變,如果改變拋出并發(fā)修改異常宵晚。

fast-fail機制常發(fā)生在哪些場景

  • 多線程對Util包下集合的并發(fā)操作(可通過使用CopyOnWrite系列類)
  • 遍歷集合的同時進行增刪操作(可通過使用Iterator的增刪方法)
  • subList后對主列表的增刪垂攘,將導致子列表的遍歷、增淤刃、刪報錯

并發(fā)容器CopyOnWrite系列類

  • 讀寫分離晒他,如果是寫操作,則復制一個新集合逸贾,在新集合內(nèi)添加或刪除元素陨仅。待一切修改完成之后,再將原集合的引用指向新的集合
  • 擴容的空間代價比較大
  • 使用批量添加或刪除方法
  • 適用于讀多寫極少的情況

關(guān)于隊列

各隊列特點

隊列 數(shù)據(jù)結(jié)構(gòu) 是否有界 線程安全
ArrayBlockingQueue 數(shù)組 ReentrantLock保證出入隊線程安全
LinkedBlockingQueue 鏈表 出入隊鎖分別使用ReentrantLock
DelayQueue 二叉堆 同上
PriorityBlockingQueue 二叉堆 同上
SynchronousQueue 隊列或堆棧 - CAS保證出入隊線程安全

隊列方法

方法名 描述 備注
add 增加一個元索 如果隊列已滿铝侵,則拋出異常
remove 移除并返回隊列頭部的元素 如果隊列為空灼伤,則拋出異常
element 返回隊列頭部的元素 如果隊列為空,則拋出異常
offer 添加一個元素并返回true 如果隊列已滿咪鲜,則返回false
poll 移除并返問隊列頭部的元素 如果隊列為空狐赡,則返回null
peek 返回隊列頭部的元素 如果隊列為空,則返回null
put 添加一個元素 如果隊列滿疟丙,則阻塞
take 移除并返回隊列頭部的元素 如果隊列為空颖侄,則阻塞

ArrayBlockingQueue 入隊代碼流程

  • 獲取鎖
  • 判斷是否已滿,滿則等待
  • 加入數(shù)組
  • 喚醒出隊線程

為什么ArrayBlockingQueue單鎖實現(xiàn)隆敢,而LinkedBlockingQueue是雙鎖发皿。

崔慧?

PriorityBlockingQueue入隊流程

  • 獲取鎖
  • 自旋判斷隊列容量是否足夠拂蝎,不足時擴容
  • 二叉堆排序
  • 喚醒出隊線程

PriorityBlockingQueue擴容機制

  • 擴容大小,小于64時約為2倍惶室,大于64時約為1.5倍
  • 默認大小温自,11
  • 通過自旋CAS加鎖后再進行擴容

DelayQueue 入隊流程

  • 加鎖
  • 加入PriorityBlockingQueue隊列
  • 判斷剛加入的是否為隊首
  • 是則leader設(shè)置為空,喚醒一個線程
  • 釋放鎖

DelayQueue出隊流程

  • 加鎖
  • 取隊首皇钞,判斷是否到了執(zhí)行時間悼泌,是則喚醒其他線程、釋放鎖并返回
  • 如果已經(jīng)有l(wèi)eader夹界,則永久等待
  • 如果沒有l(wèi)eader馆里,則晉升為leader,等待直到隊首的執(zhí)行時間
  • 釋放鎖

DelayQueue的重點

  • 底層依賴PriorityBlockingQueue
  • 入隊的數(shù)據(jù)必須實現(xiàn)Delayed接口
  • leader的作用,多個消費者線程同時用take方法去取時,只有一個線程能成為leader鸠踪,其他的會由于leader不為空 丙者,而永久等待。

SynchronousQueue的重點

  • 容量為0
  • 匹配插入線程和移除線程营密,資源從插入線程移交給移除線程
  • 有公平模式(先進先出隊列)和非公平模式(先進后出棧)
  • 適合作為管道械媒,資源從一個線程傳遞給另一個線程

ConcurrentLinkedQueue 核心

  • 不允許null入列,因為尾節(jié)點的定位是通過next是否為null判斷的
  • 底層使用cas包裝入列出列安全评汰。
  • head節(jié)點跟tail不一定指向頭節(jié)點或尾節(jié)點纷捞,可能存在滯后性。
  • size方法是通過遍歷獲取的被去,當同時存在其他線程入隊出隊操作時主儡,該值可能不精確。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末编振,一起剝皮案震驚了整個濱河市缀辩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌踪央,老刑警劉巖臀玄,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異畅蹂,居然都是意外死亡健无,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門液斜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來累贤,“玉大人,你說我怎么就攤上這事少漆【矢啵” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵示损,是天一觀的道長渗磅。 經(jīng)常有香客問我,道長检访,這世上最難降的妖魔是什么始鱼? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮脆贵,結(jié)果婚禮上医清,老公的妹妹穿的比我還像新娘。我一直安慰自己卖氨,他們只是感情好会烙,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布负懦。 她就那樣靜靜地躺著,像睡著了一般柏腻。 火紅的嫁衣襯著肌膚如雪密似。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天葫盼,我揣著相機與錄音残腌,去河邊找鬼。 笑死贫导,一個胖子當著我的面吹牛抛猫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播孩灯,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼闺金,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了峰档?” 一聲冷哼從身側(cè)響起败匹,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讥巡,沒想到半個月后掀亩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡欢顷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年槽棍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抬驴。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡炼七,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出布持,到底是詐尸還是另有隱情豌拙,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布题暖,位于F島的核電站按傅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芙委。R本人自食惡果不足惜逞敷,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一狂秦、第九天 我趴在偏房一處隱蔽的房頂上張望灌侣。 院中可真熱鬧,春花似錦裂问、人聲如沸侧啼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痊乾。三九已至皮壁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哪审,已是汗流浹背蛾魄。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留湿滓,地道東北人滴须。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像叽奥,于是被迫代替她去往敵國和親扔水。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容