Java面試知識點(四十八)集合框架詳解

一、集合與數組

數組(可以存儲基本數據類型)是用來存現對象的一種容器,但是數組的長度固定,不適合在對象數量未知的情況下使用。

集合(只能存儲對象,對象類型可以不一樣)的長度可變,可在多數情況下使用。

二、層次關係

如圖所示:圖中,實線邊框的是實現類,折線邊框的是抽象類,而點線邊框的是接口
在這裏插入圖片描述
Collection 接口是集合類的根接口,Java 中沒有提供這個接口的直接的實現類。但是卻讓其被繼承產生了兩個接口,就是 Set 和 List。Set 中不能包含重複的元素。List 是一個有序的集合,可以包含重複的元素,提供了按索引訪問的方式。

Map 是 Java.util 包中的另一個接口,它和 Collection 接口沒有關係,是相互獨立的,但是都屬於集合類的一部分。Map 包含了 key-value 對。Map 不能包含重複的 key,但是可以包含相同的 value。

Iterator,所有的集合類,都實現了 Iterator 接口,這是一個用於遍歷集合中元素的接口,主要包含以下三種方法:
1.hasNext () 是否還有下一個元素。
2.next () 返回下一個元素。
3.remove () 刪除當前元素。

三、幾種重要的接口和類簡介

1、List(有序、可重複)
List 裏存放的對象是有序的,同時也是可以重複的,List 關注的是索引,擁有一系列和索引相關的方法,查詢速度快。因爲往 list 集合裏插入或刪除數據時,會伴隨着後面數據的移動,所有插入刪除數據速度慢。

2、Set(無序、不能重複)
Set 裏存放的對象是無序,不能重複的,集合中的對象不按特定的方式排序,只是簡單地把對象加入集合中。

3、Map(鍵值對、鍵唯一、值不唯一)
Map 集合中存儲的是鍵值對,鍵不能重複,值可以重複。根據鍵得到值,對 map 集合遍歷時先得到鍵的 set 集合,對 set 集合進行遍歷,得到相應的值。

在這裏插入圖片描述

四、遍歷

在類集中提供了以下四種的常見輸出方式:

1)Iterator:迭代輸出,是使用最多的輸出方式。

2)ListIterator:是 Iterator 的子接口,專門用於輸出 List 中的內容。

3)foreach 輸出:JDK1.5 之後提供的新功能,可以輸出數組或集合。

4)for 循環

// iterator 的形式:
Iterator it = arr.iterator();
while(it.hasNext()){ object o =it.next(); ...}

五、ArrayList 和 LinkedList

ArrayList 和 LinkedList 在用法上沒有區別,但是在功能上還是有區別的。LinkedList 經常用在增刪操作較多而查詢操作很少的情況下,ArrayList 則相反。

六、Map 集合

1.實現類:HashMap、Hashtable、LinkedHashMap 和 TreeMap

HashMap

HashMap 是最常用的 Map,它根據鍵的 HashCode 值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得數據的順序是完全隨機的。因爲鍵對象不可以重複,所以 HashMap 最多隻允許一條記錄的鍵爲 Null,允許多條記錄的值爲 Null,是非同步的

Hashtable

Hashtable 與 HashMap 類似,是 HashMap 的線程安全版,它支持線程的同步,即任一時刻只有一個線程能寫 Hashtable,因此也導致了 Hashtale 在寫入時會比較慢,它繼承自 Dictionary 類,不同的是它不允許記錄的鍵或者值爲 null,同時效率較低。

ConcurrentHashMap

線程安全,並且鎖分離。ConcurrentHashMap 內部使用段 (Segment) 來表示這些不同的部分,每個段其實就是一個小的 hash table,它們有自己的鎖。只要多個修改操作發生在不同的段上,它們就可以併發進行。

LinkedHashMap

LinkedHashMap 保存了記錄的插入順序,在用 Iteraor 遍歷 LinkedHashMap 時,先得到的記錄肯定是先插入的,在遍歷的時候會比 HashMap 慢,有 HashMap 的全部特性。

TreeMap

TreeMap 實現 SortMap 接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序(自然順序),也可以指定排序的比較器,當用 Iterator 遍歷 TreeMap 時,得到的記錄是排過序的。不允許 key 值爲空,非同步的;

七、主要實現類區別小結

Vector 和 ArrayList

1,vector 是線程同步的,所以它也是線程安全的,而 arraylist 是線程異步的,是不安全的。如果不考慮到線程的安全因素,一般用 arraylist 效率比較高。

2,如果集合中的元素的數目大於目前集合數組的長度時,vector 增長率爲目前數組長度的 100%,而 arraylist 增長率爲目前數組長度的 50%。如果在集合中使用數據量比較大的數據,用 vector 有一定的優勢。

3,如果查找一個指定位置的數據,vector 和 arraylist 使用的時間是相同的,如果頻繁的訪問數據,這個時候使用 vector 和 arraylist 都可以。而如果移動一個指定位置會導致後面的元素都發生移動,這個時候就應該考慮到使用 linklist, 因爲它移動一個指定位置的數據時其它元素不移動。

ArrayList 和 Vector 是採用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,都允許直接序號索引元素,但是插入數據要涉及到數組元素移動等內存操作,所以索引數據快,插入數據慢,Vector 由於使用了 synchronized 方法(線程安全)所以性能上比 ArrayList 要差LinkedList 使用雙向鏈表實現存儲,按序號索引數據需要進行向前或向後遍歷,但是插入數據時只需要記錄本項的前後項即可,所以插入數度較快。

arraylist 和 linkedlist

1.ArrayList 是實現了基於動態數組的數據結構,LinkedList 基於鏈表的數據結構。

2.對於隨機訪問 get 和 set,ArrayList 覺得優於 LinkedList,因爲 LinkedList 要移動指針。

3.對於新增和刪除操作 add 和 remove,LinedList 比較佔優勢,因爲 ArrayList 要移動數據。 這一點要看實際情況的。若只對單條數據插入或刪除,ArrayList 的速度反而優於 LinkedList。但若是批量隨機的插入刪除數據,LinkedList 的速度大大優於 ArrayList. 因爲 ArrayList 每插入一條數據,要移動插入點及之後的所有數據。

HashMap 與 TreeMap

1、 HashMap 通過 hashcode 對其內容進行快速查找,而 TreeMap 中所有的元素都保持着某種固定的順序,如果你需要得到一個有序的結果你就應該使用 TreeMap(HashMap 中元素的排列順序是不固定的)。

2、在 Map 中插入、刪除和定位元素,HashMap 是最好的選擇。但如果您要按自然順序或自定義順序遍歷鍵,那麼 TreeMap 會更好。使用 HashMap 要求添加的鍵類明確定義了 hashCode () 和 equals () 的實現。

兩個 map 中的元素一樣,但順序不一樣,導致 hashCode () 不一樣。
同樣做測試:
在 HashMap 中,同樣的值的 map, 順序不同,equals 時,false;
而在 treeMap 中,同樣的值的 map, 順序不同,equals 時,true,說明,treeMap 在 equals () 時是整理了順序了的。

HashTable 與 HashMap

1、同步性:Hashtable 是線程安全的,也就是說是同步的,而 HashMap 是線程序不安全的,不是同步的

2、HashMap 允許存在一個爲 null 的 key,多個爲 null 的 value 。

3、hashtable 的 key 和 value 都不允許爲 null。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章