說說常見的集合有哪些?java
答:主要分List、Set、Map、Queue四類,其中包含ArrayList、LinkedList、HashSet、TreeSet、HashMap算法
Comparable和Comparator接口的區別?數組
答:其二者的目的都是讓對象可比。第一種將須要比較的類可實現Comparable並重寫comparaTo方法制定比較規制,如此讓類自己具有可比性,無需依賴其餘第三方類。第二種爲須要比較的類再定義一個比較類,該類須要基礎Comparator接口實現compara方法傳入倆個須要對象的進行比較,該方法須要依賴第三方類。安全
集合使用泛型有什麼優勢?數據結構
答:泛型容許咱們爲集合提供一個能夠容納的對象類型,所以,若是你添加其它類型的任何元素,它會在編譯時報錯。這避免了在運行時出現ClassCastException,由於你將會在編譯時獲得報錯信息。多線程
List、Set、Map之間的區別是什麼?性能
答:優化
爲何Map接口不繼承Collection接口?線程
答:Map提供的是鍵值對映射(即Key和value的映射),而collection提供的是一組數據(並非鍵值對映射)。若是map繼承了collection接口,那麼全部實現了map接口的類究竟是用map的鍵值對映射數據仍是用collection的一組數據呢(就咱們日常所用的hashMap、hashTable、treeMap等都是鍵值對,因此它繼承collection徹底沒意義),並且map若是繼承了collection接口的話還違反了面向對象的接口分離原則。code
經常使用的線程安全的Map有哪些?
答:HashTable,ConcurrentHashMap
HashMap和Hashtable有什麼區別?
答:
HashMap和TreeMap怎麼選?
答:存放的數據須要排序選擇TreeMap,不須要排序選擇HashMap,並且能夠根據HashMap空間的使用,對初始容量和負載因子進行調優。
HashMap的數據結構是什麼?
答:數組+鏈表/紅黑樹,通常稱爲「鏈表散列」
HashMap在JDK 8中有哪些改變?
答:JDK8以前HashMap採用的數據結構爲數組+鏈表,JDK8以後HashMap採用數組+鏈表/紅黑樹。增長紅黑樹來優化鏈表過長時帶來的查詢性能消耗;
發生Hash衝突時
JDK7:插入鏈表的頭部,頭插法
JDK8:插入鏈表的尾部,尾插法
HashMap是怎麼解決Hash衝突的?
答:
HashMap是怎麼擴容的?
答:當存儲的數據量達到總容量的負載因子大小(默認0.75)時開始擴容。擴容會建立當前數組大小的兩倍,再將原來的數據從新進行hash計算存儲位置,因而可知HashMap擴容對性能的消耗比較嚴重
HashMap如何實現同步?
答:
lock.lock();
Value = map.get(key);
lock.unlock();
ConcurrentHashMap的數據結構是什麼?
答:CurrentHashMap的結構是Segment數組的意義就是將一個大的table分割成多個小的table來進行加鎖,也就是上面的提到的鎖分離技術,而每個Segment元素存儲的是HashEntry數組+鏈表,這個和HashMap的數據存儲結構同樣。
ArrayList是線程安全的嗎?
答:線程不安全
經常使用線程安全的List集合有哪些?
答:Vector、以及經過java.util.Collections.SynchronizedList將任何List轉換爲線程安全、CopyOnWriteArrayList複製寫入,添加元素時先加鎖而且複製一份原來的List再添加元素,最後釋放鎖。
循環刪除List集合可能會發生什麼異常?
答:會致使數組元素位移,形成元素誤刪。解決辦法是倒着刪除或者使用迭代器遍歷時刪除
ArrayList和LinkedList有什麼區別?
答:數據結構不一樣,ArrayList底層採用數組,查詢快增長或刪除慢(涉及到數據元素位移)。LinkedList底層採用鏈表結構,查詢慢,增長刪除快
ArrayList和Vector有什麼區別?
答:ArrayList線程不安全效率高,Vector線程安全效率低
什麼是CopyOnWriteArrayList?
答:CopyOnWriteArrayList是ArrayList的一個線程安全的變體,其中全部可變操做(add、set等等)都是經過對底層數組進行一次新的複製來實現的。相比較於ArrayList它的寫操做要慢一些,由於它須要實例的快照。
CopyOnWriteArrayList中寫操做須要大面積複製數組,因此性能確定不好,可是讀操做由於操做的對象和寫操做不是同一個對象,讀之間也不須要加鎖,讀和寫之間的同步處理只是在寫完後經過一個簡單的"="將引用指向新的數組對象上來,這個幾乎不須要時間,
什麼是fail-safe?
答:當咱們對集合結構上作出改變的時候,fail-fast機制就會拋出異常。可是,對於採用fail-safe機制來講,就不會拋出異常
這是由於,當集合的結構被改變的時候,fail-safe機制會在複製原集合的一份數據出來,而後在複製的那份數據遍歷。
什麼是fail-fast?
答:fail-fast的字面意思是「快速失敗」。當咱們在遍歷集合元素的時候,常常會使用迭代器,但在迭代器遍歷元素的過程當中,若是集合的結構被改變的話,就會拋出異常,防止繼續遍歷。這就是所謂的快速失敗機制。fail-fast,即快速失敗機制,它是java集合中的一種錯誤檢測機制,當多個線程(單個線程也是能夠滴),在結構上對集合進行改變時,就有可能會產生fail-fast機制。
fail-fast和fail-safe有什麼區別?
答:
fail-safe任何對集合結構的修改都會在一個複製的集合上進行修改,所以不會拋出ConcurrentModificationException
fail-safe機制有兩個問題
(1)須要複製集合,產生大量的無效對象,開銷大
(2)沒法保證讀取的數據是目前原始數據結構中的數據。
fail-fast機制在遍歷一個集合時,當集合結構被修改,會拋出Concurrent Modification Exception。
fail-fast會在如下兩種狀況下拋出ConcurrentModificationException
(1)單線程環境
集合被建立後,在遍歷它的過程當中修改告終構。
注意 remove()方法會讓expectModcount和modcount 相等,因此是不會拋出這個異常。
(2)多線程環境
當一個線程在遍歷這個集合,而另外一個線程對這個集合的結構進行了修改。
HashSet的底層實現原理是什麼?
答:HashSet底層依賴與HashMap進行數據存儲,HashSet的元素就是HashMap中的Key,而Value則爲Null
怎麼確保一個集合不能被修改?
答:兩種實現方式,Collections. unmodifiableCollection(Collection c) 方法建立的集合(
最終會返回一個由Collections.UnmodifiableCollection類,該類對全部的寫操做都進行了重寫覆蓋,使其拋出UnsupportedOperationException異常),和使用Arrays.asList建立的集合(返回了一個Arrays的靜態內部類ArrayList,原理與Collections.UnmodifiableCollection差很少)。