Java集合框架 面試問題整理

簡介

java集合類是java.util 包中的重要內容。java集合框架包含了大量集合接口以及這些接口的實現類和操做他們的算法。java

java集合框架圖

java集合框架圖 示例圖片

主要提供的數據結構

  • List

又稱有序的Collection。它按照對象的進入順序保存對象,能夠對列表中的每一個元素的出入和刪除元素位置進行精確的控制。同時,它能夠保存重複的對象。 LinkedList、ArrayList、Vector都實現了List接口。算法

  • Set

Set 是數學意義上的集合。集合中元素不可重複。所以存入set的每一個元素都必須經過equals()方法來肯定對象的惟一性。 Set 接口有兩實現類,HashSet和TreeSet其中<u>TreeSet 實現了SrotedSet接口</u>因此TreeSet是有序的。數組

  • Map

Map 提供一個從鍵映射到值得數據結構。它用於保存鍵值對,其中值能夠重複,可是鍵必定惟一,不能重複。Java類庫中有多個實現該接口的類:HashMap、LinkedHashMap、TreeMap、WeakHashMap、IdentityHashMap。安全

Collection和Collections有什麼區別

  • Collection是一個集合的接口。它提供了對集合對象進行基本操做的通用接口方法。實現該類的主要方法有List和Set。
  • Collections是針對集合類的一個包裝類,它提供一系列的靜態方法以實現對各類集合的搜索、排序、線程安全化等操做。(其中大多數方法都是用來處理線性表)

List

ArrayList,LinkedList和Vector的區別

  • ArrayList和Vector都是由Object[]實現的,LinkedList是由雙向鏈表實現的。
  • Vector是線程安全的,Vector中絕大多數的方法都是直接或者間接同步的。
  • ArrayList每次擴容1.5倍,Vector每次擴容2倍。

Map

HashMap添加的過程

  1. 調用Key的hashCode()方法生成一個hash值h1。 >> + 若是這個h1在HashMap中不存在,那麼直接將<key,value>添加到HashMap中。 >> + 若是這個h1已經存在了那麼找出HashMap中全部Hash值爲h1的key。
  2. 分別調用equals()方法判斷當前添加的key是否與已經存在的key值相同 >> 若是相同,說明當前的Key已經存在。HashMap會使用新的value覆蓋原有的value。 >> 若是沒有相同,說明當前的Key不存在。HashMap會建立新的映射關係。
  3. Hash衝突的解決。(當新增的key的Hash值在HashMap中存在時,就會產生衝突。通常有開放地址法、再Hash法、鏈地址法等解決Hash衝突問題。 HashMap使用的是鏈地址法來解決衝突的

HashMap的查找過程

  1. 調用hashCode()方法獲取Key的Hash值h,肯定鍵爲Key的全部值存儲的首地址。
  2. 若是Key的值有多個,程序會遍歷全部結果,並經過調用key的equals()方法來判斷key的內容是否相等。只有當equals()方法的返回值爲true時,對應的value纔是正確值。

HashMap和HashTable的區別

  • 繼承的父類不一樣:HashTable繼承自Dictionary類,而HashMap繼承自Abstract Map類可是都二者實現了Map接口數據結構

  • 線程安全性不一樣:HashTable 的方法是線程安全的,其中的每一個方法都加入了Synchronized同步。框架

  • 提供的方法不一樣:HashMap和HashTable類似度很高,可是也有區別,在HashMap中將contain方法去掉了,改爲了containsValue和containsKey。(contains容易形成誤解spa

  • key和value是否能夠爲空值(null):在HashMap中容許且只容許一個key值爲null,容許多個value值爲null。HashTable中Key和value都不容許爲null。線程

  • 遍歷方式實現不一樣:HashTable和HashMap都是用了迭代器Iterator ^迭代器Iterator
    HashTable中還使用了Enumeration方式。3d

  • Hash值不一樣:HashTable直接將對象的HashCode做爲Hash值。HashMap則從新計算key的Hash值。code

  • 數組的初始化不一樣:HashTable默認爲11,擴容爲(old*2+1),HashMap 默認爲16,擴容爲(old*2)

WeakHashMap 和 HashMap 的異同

  • WeakHashMap 和 HashMap相似。兩者不一樣的地方在於WeakHashMap中的Key採用的是「弱引用」的方式,只要WeakHashMap中的Key再也不被外部引用。它就能夠被垃圾回收器回收。
  • 而HashMap採用的是「強引用」的方式。當HashMap中的Key沒有被外部引用時,只有在這key從HashMap中被刪除以後,才能夠被垃圾回收器回收。

HashMap、LinkedHashMap和TreeMap的異同

  • HashMap裏面存入的鍵值對在取出時沒有固定的順序,是隨機的。
  • TreeMap實現了SortMap的接口,可以把保存的記錄根據鍵排序。所以取出來的是排序好的鍵值對。
  • LinkedHashMap 是HashMap的一個子類,若是須要輸入和輸出順序相同則使用LinkedHashMap能夠實現。(LinkedHashMap還能夠按照讀取順序排序)

HashMap 上下文中,同步指的是什麼?

同步意味着,在同一時刻中只有一個線程能夠修改Hash表,任何線程在執行HashTable的更新操做前都要獲取對象鎖,其餘線程則等待線程鎖的釋放。

如何實現HashMap的同步?

HashMap以使用

Map m = Collections.synchronizedMap(new HashMap());

來達到同步的效果。

相關文章
相關標籤/搜索