一、集合是什麼 ?
1. 集合知識概念
前面我們學習過了,Java中的基本類型,任何單一的數據都可以用基本類型來表達,這些單一的基本類型被統一的組合或者管理起來的就是集合,或者叫容器也可以。
舉例:
我們用數據來表示一個學校的存在。首先我們先來分析一波,學校的組成。
- 學校的組成 = 班級的集合
- 班級 = 學生的集合
前面我們說了,單一的數據類型都可以用基本類型來表示。那麼我們用 String 類型來表示學生的名字。
A班一共有3個學生(小明,小紅,小張)。那麼小明等人就可以用基本類型來表示,而A班就可以用集合來表示。 S學校一共有2個班級(A,B)。 因為A和B都是學生的集合,所以A、B都是集合。而S學校同樣是A、B的集合。
2. Java中的具體體現
- 集合類存放於 java.util 包中
- 集合類型主要有3種:list (列表)、set (集)、和 map (映射)。
後面會詳細講解
list 集合允許出現重複的元素Set 集合中元素不能是重複的map 是一個特殊集合容器,是有key-value組成的,我們也可以叫字典。因為它跟字典一樣,可以根據key,來找到對應的數據value。
二、用偽代碼構建一個學校
偽代碼展示
1. 定義A班級學生
2. 定義A班級並添加學生
3. 定義B班級學生
4. 定義B班級並添加學生
5. 定義學校並添加AB兩個班級
三、集合實現類及常用API ?
Java 集合框架主要包括兩種類型的容器,一種是集合(Collection),存儲一個元素集合,另一種是Map,存儲鍵/值對映射。
1. Collection
Collection 接口又有 3 種子類型,List、Set 和 Queue。其中List和Set是最長用的。Queue相對來說用的比較少,作為入門基本學習前兩個已經夠用了。
因為List和Set都是實現自Collection,所以List和Set的API是一樣的,只要初學者記住Collection的常用方法和List和Set各個實現類的特點即可掌握。
List 和 Set 區別
List實現類特點
Set實現類特點
Collection常用API
總結
- 安全的不高效,高效的不安全。要根據使用環境確定使用哪一個。
- 一般開發中List基本都是 ArrayList,而 Set 使用 HashSet。
2. Map
Map是一種特殊的集合容器,它的數據結構是key-value的形式,類似於字典。Map的主要作用就是作為字典使用,通過key來查詢value比如上面的例子,就可以根據學生的名字,來找到學生具體所在的班級,我們對Map的學習主要學習其各個實現類的特點和常用API即可
實現類特點
Map集合常用API
四、 Java集合進階知識點
1.Map高級
這裡所說的高級,基本就是面試時候,面試官會經常考的知識點。
- ①線程安全
- ②哈希碰撞
- ③加載因子
- ④為什麼ConcurrentHashMap效率高並安全
① 線程安全
HashTable 是線程安全的,因為它的所有方法都被 synchronized修飾,所以安全,但是效率相對是低於 HashMap 的。 HashMap 雖然是線程不安全但是效率比較高。小編建議如果在不涉及多線程操作的情況下,建議使用HashMap。 那麼什麼情況是不涉及多線程呢? 最簡單的場景就是在只需要在方法中使用的時候可以用HashMap。但是凡事要作為對象的實例變量的情況下,一定就不能使用HashMap。因為它線程不安全。建議使用ConcurrentHashMap
②哈希碰撞
什麼是哈希碰撞,前面說了凡事Hash開頭的Map實現類,底層都是使用Hash來實現的,即將Key通過hash算法得到一個位置,然後在該位置上存儲value。但是假如key1和key2通過算法得到的位置是一樣的,即說明出現了hash碰撞的場景。那麼如何避免哈希膨脹呢? 答案就是擴容,默認當HashMap中的鍵值對達到數組大小的75%時,即會觸發擴容。通過擴容的方式來避免哈希碰撞
③加載因子
前面說哈希碰撞時候,解決方案就是擴容,那麼如何知道要擴容呢? 默認當Hash達到75%時候就擴容,這個75%就叫做加載因子。
④為什麼ConcurrentHashMap效率高並安全
Hashtable的synchronized是針對整張Hash表的,即每次鎖住整張表讓線程獨占,ConcurrentHashMap允許多個修改操作並發進行,其關鍵在於使用了鎖分離技術。通過把整個Map分為N個Segment,可以提供相同的線程安全,但是效率提升N倍,默認提升16倍。(讀操作不加鎖,由於HashEntry的value變量是 volatile的,也能保證讀取到最新的值。)
面試時候可以簡單回答: 每一個Segment相當於HashTable,假如Map分成了N個分段,一般情況如果並發的數量小於N都不會出現鎖阻斷情況,但是當並發數大於N時候,同樣會有性能為題,ConcurrentHashMap相當於HashTable和HashMap的一個這種方案。
五、哪些場景需要使用到集合 ?
作為初學者,往往不知道學習的這些東西,到底有什麼用處。在此小編簡單描述下。
1. 需要批量操作使用List
2. Map作為字典使用
根據Map的key和value的數據結構,可以將key設置成查詢條件,然後找到對應的value。