Java面試題集合

1.Java的HashMap是如何工做的?

HashMap是一個針對數據結構的鍵值,每一個鍵都會有相應的值,關鍵是識別這樣的值。面試

HashMap 基於 hashing 原理,咱們經過 put ()和 get ()方法儲存和獲取對象。當咱們將鍵值對傳遞給 put ()方法時,它調用鍵對象的 hashCode ()方法來計算 hashcode,讓後找到 bucket 位置來儲存值對象。當獲取對象時,經過鍵對象的 equals ()方法找到正確的鍵值對,而後返回值對象。HashMap 使用 LinkedList 來解決碰撞問題,當發生碰撞了,對象將會儲存在 LinkedList 的下一個節點中。 HashMap 在每一個 LinkedList 節點中儲存鍵值對對象。算法

2.什麼是快速失敗的故障安全迭代器?

快速失敗的Java迭代器可能會引起ConcurrentModifcationException在底層集合迭代過程當中被修改。故障安全做爲發生在實例中的一個副本迭代是不會拋出任何異常的。快速失敗的故障安全範例定義了當遭遇故障時系統是如何反應的。例如,用於失敗的快速迭代器ArrayList和用於故障安全的迭代器ConcurrentHashMap。數組

3.Java BlockingQueue是什麼?

Java BlockingQueue是一個併發集合util包的一部分。BlockingQueue隊列是一種支持操做,它等待元素變得可用時來檢索,一樣等待空間可用時來存儲元素。緩存

4.何時使用ConcurrentHashMap?

在問題2中咱們看到ConcurrentHashMap被做爲故障安全迭代器的一個實例,它容許完整的併發檢索和更新。當有大量的併發更新時,ConcurrentHashMap此時能夠被使用。這很是相似於Hashtable,但ConcurrentHashMap不鎖定整個表來提供併發,因此從這點上ConcurrentHashMap的性能彷佛更好一些。因此當有大量更新時ConcurrentHashMap應該被使用。安全

5.哪個List實現了最快插入?

LinkedList和ArrayList是另個不一樣變量列表的實現。ArrayList的優點在於動態的增加數組,很是適合初始時總長度未知的狀況下使用。LinkedList的優點在於在中間位置插入和刪除操做,速度是最快的。數據結構

LinkedList實現了List接口,容許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操做使LinkedList可被用做堆棧(stack),隊列(queue)或雙向隊列(deque)。多線程

ArrayList實現了可變大小的數組。它容許全部元素,包括null。 每一個ArrayList實例都有一個容量(Capacity),即用於存儲元素的數組的大小。這個容量可隨着不斷添加新元素而自動增長,可是增加算法並無定義。當須要插入大量元素時,在插入前能夠調用ensureCapacity方法來增長ArrayList的容量以提升插入效率。併發

6.Iterator和ListIterator的區別

  • ListIterator有add()方法,能夠向List中添加對象,而Iterator不能。
  • ListIterator和Iterator都有hasNext()和next()方法,能夠實現順序向後遍歷,可是ListIterator有hasPrevious()和previous()方法,能夠實現逆向(順序向前)遍歷。Iterator就不能夠。
  • ListIterator能夠定位當前的索引位置,nextIndex()和previousIndex()能夠實現。Iterator沒有此功能。
  • 均可實現刪除對象,可是ListIterator能夠實現對象的修改,set()方法能夠實現。Iierator僅能遍歷,不能修改。

7.什麼是CopyOnWriteArrayList,它與ArrayList有何不一樣?

CopyOnWriteArrayList是ArrayList的一個線程安全的變體,其中全部可變操做(add、set等等)都是經過對底層數組進行一次新的複製來實現的。相比較於ArrayList它的寫操做要慢一些,由於它須要實例的快照。性能

CopyOnWriteArrayList中寫操做須要大面積複製數組,因此性能確定不好,可是讀操做由於操做的對象和寫操做不是同一個對象,讀之間也不須要加鎖,讀和寫之間的同步處理只是在寫完後經過一個簡單的"="將引用指向新的數組對象上來,這個幾乎不須要時間,這樣讀操做就很快很安全,適合在多線程裏使用,絕對不會發生ConcurrentModificationException ,所以CopyOnWriteArrayList適合使用在讀操做遠遠大於寫操做的場景裏,好比緩存。線程

 

8.迭代器和枚舉之間的區別

若是面試官問這個問題,那麼他的意圖必定是讓你區分Iterator不一樣於Enumeration的兩個方面:

  • Iterator容許移除從底層集合的元素。
  • Iterator的方法名是標準化的。

9.Hashmap如何同步?

當咱們須要一個同步的HashMap時,有兩種選擇:

  • 使用Collections.synchronizedMap(..)來同步HashMap。
  • 使用ConcurrentHashMap的

這兩個選項之間的首選是使用ConcurrentHashMap,這是由於咱們不須要鎖定整個對象,以及經過ConcurrentHashMap分區地圖來得到鎖。

10.IdentityHashMap和HashMap的區別

IdentityHashMap是Map接口的實現。不一樣於HashMap的,這裏採用參考平等。

  • 在HashMap中若是兩個元素是相等的,則key1.equals(key2)
  • 在IdentityHashMap中若是兩個元素是相等的,則key1 == key2
相關文章
相關標籤/搜索