天天看點

【重難點】【Java集合 02】Set、List、Map 的差別、常見的線程安全的集合類、Collection 為什麼隻能在 Iterator 中删除元素【重難點】【Java集合 02】List、Set、Map 的差別、常見的線程安全的集合類、Collection 為什麼隻能在 Iterator 中删除元素一、List、Map、Set 的差別二、常見的線程安全的集合類三、Collection 為什麼在 Iterator 中删除元素時會抛異常

【重難點】【Java集合 02】List、Set、Map 的差別、常見的線程安全的集合類、Collection 為什麼隻能在 Iterator 中删除元素

文章目錄

  • 【重難點】【Java集合 02】List、Set、Map 的差別、常見的線程安全的集合類、Collection 為什麼隻能在 Iterator 中删除元素
  • 一、List、Map、Set 的差別
    • 1.Java 集合架構
    • 2.Set 接口
    • 3.List 接口
    • 4.Map 接口
    • 5.總結
  • 二、常見的線程安全的集合類
    • 1.什麼叫線程安全
    • 2.實作線程安全的方式
  • 三、Collection 為什麼在 Iterator 中删除元素時會抛異常

一、List、Map、Set 的差別

1.Java 集合架構

Java 集合架構主要包括兩種類型的容器,一種是集合(Collection),存儲一個元素集合,另一種是圖(Map),存儲鍵值對

【重難點】【Java集合 02】Set、List、Map 的差別、常見的線程安全的集合類、Collection 為什麼隻能在 Iterator 中删除元素【重難點】【Java集合 02】List、Set、Map 的差別、常見的線程安全的集合類、Collection 為什麼隻能在 Iterator 中删除元素一、List、Map、Set 的差別二、常見的線程安全的集合類三、Collection 為什麼在 Iterator 中删除元素時會抛異常
【重難點】【Java集合 02】Set、List、Map 的差別、常見的線程安全的集合類、Collection 為什麼隻能在 Iterator 中删除元素【重難點】【Java集合 02】List、Set、Map 的差別、常見的線程安全的集合類、Collection 為什麼隻能在 Iterator 中删除元素一、List、Map、Set 的差別二、常見的線程安全的集合類三、Collection 為什麼在 Iterator 中删除元素時會抛異常

Collection 中可以容納一組集合元素,Map 沒有繼承 Iterable 接口,與 Collection 是并列關系

2.Set 接口

Set 是一個繼承自 Collection 的接口

Set 中不允許有重複的元素,重複元素會被覆寫

Set 僅允許有一個 NULL

Set 元素無放入順序,但是元素在 Set 中的位置是由該元素的 HashCode 決定的,其位置是固定的

Set 隻可用疊代器周遊

3.List 接口

List 是一個繼承自 Collection 的接口

List 允許有重複的元素

List 允許有多個 NLL

List 元素有放入順序

List 中的每一個元素都有一個索引,支援 for 循環周遊,也可用疊代器周遊

4.Map 接口

Map 與 List、Set 接口不同,它是由一系列鍵值對組成的集合,提供了 Kye 到 Value 的映射,一個 Key 對應一個 Value,是以它不能存在相同的 Key 值,當然,Value 值可以相同

5.總結

Set 無放入順序和下标,查找效率低;插入和删除效率高,插入和删除不會引起元素位置改變

List 有放入順序和下标,查找效率高;插入和删除效率低,插入和删除會引起元素位置改變

Map 适合儲存鍵值對資料

二、常見的線程安全的集合類

Vector、Stack、Hashtable、ConcurrenthashMap

1.什麼叫線程安全

線程安全是應用于多線程代碼的一種計算機程式設計概念,它確定多個線程能夠按照程式的設計正确地通路共享資料結構

或者再貼近一點程式設計語言的角度來講,線程安全指的是同時最少有兩個及以上的線程操作共享的資料區域,并且至少有一個是寫操作

2.實作線程安全的方式

方式一:核心思路是避免共享資料結構和共享狀态:

  • 使用線程本地變量
  • 使用不可變對象

方式二:共享不可避免,需要通過條件來確定多個線程按照程式的設計正确地通路共享資料結構

  • 互斥鎖
  • CAS 原子操作

三、Collection 為什麼在 Iterator 中删除元素時會抛異常

在 Iterator 的内部有個 expectedModCount 變量,該變量每次初始化 Iterator 的時候等于 ArrayList 的 modCount,modeCount 記錄了對 ArrayList 的結構修改次數

在通過 Iterator 對 ArrayList 進行結構的修改時,都會将 expectedModeCount 與 modeCount 同步,但是如果在通過 Iterator 周遊的時候同時又通過索引的方式去修改 ArrayList 的結構的話,由于通過索引的方式隻會修改 modCount,就會導緻 modCount 和 expectedModCount 不相等抛出 ConcurrentModificationException

解決方法是采取同一種方式周遊和修改 Collection