java面試1、1.2集合

免責聲明:
    本文內容多來自網絡文章,轉載爲我的收藏,分享知識,若有侵權,請聯繫 博主進行刪除。

1.2常見集合

  • List、Set、Map的區別以及選用

List和Set都繼承與Collection接口;
List:1.能夠容許重複的對象。
   2.能夠插入多個null元素。
3.是一個有序容器,保持了每一個元素的插入順序,輸出的順序就是插入的順序。
4.經常使用的實現類有 ArrayList、LinkedList 和 Vector。ArrayList 最爲流行,它提供了使用索引的隨意訪問,而 LinkedList 則對於常常須要從 List 中添加或刪除元素的場合更爲合適。
Set:1.不容許重複對象
   2. 無序容器,你沒法保證每一個元素的存儲順序,TreeSet經過 Comparator 或者 Comparable 維護了一個排序順序。
3. 只容許一個 null 元素
4.Set 接口最流行的幾個實現類是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基於 HashMap 實現的 HashSet;TreeSet 還實現了 SortedSet 接口,所以 TreeSet 是一個根據其 compare() 和
compareTo() 的定義進行排序的有序容器。算法

Map:
1.Map不是collection的子接口或者實現類。Map是一個接口。
2.Map 的 每一個 Entry 都持有兩個對象,也就是一個鍵一個值,Map 可能會持有相同的值對象但鍵對象必須是惟一的。數組

  1. TreeMap 也經過 Comparator 或者 Comparable 維護了一個排序順序。
  2. Map 裏你能夠擁有隨意個 null 值但最多隻能有一個 null 鍵。
    5.Map 接口最流行的幾個實現類是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最經常使用)
  • Set和hashCode以及equals方法的聯繫

**緩存

set保證裏面元素的惟一性實際上是靠兩個方法,一是equals()和hashCode()方法;
set在存入數據使用了hashCode(),先進行取hashcode,在將獲得的值插入到指定算出來的地址上,若是下次有相同值對應這個地址,則使用equals()比較,相同則過濾,不一樣則經過解決衝突算法,將該值存入起來。安全

  • Arraylist 與 LinkedList 區別

**網絡

LinkedeList和ArrayList都實現了List接口,可是它們的工做原理卻不同。ArrayList是實現了基於動態數組的數據結構,LinkedList基於鏈表的數據結構。 (LinkedList是雙向鏈表,有next也有previous)
區別:
1) 由於Array是基於索引(index)的數據結構,它使用索引在數組中搜索和讀取數據是很快的。Array獲取數據的時間複雜度是O(1),可是要刪除數據倒是開銷很大的,由於這須要重排數組中的全部數據。
2) 相對於ArrayList,LinkedList插入是更快的。由於LinkedList不像ArrayList同樣,不須要改變數組的大小,也不須要在數組裝滿的時候要將全部的數據從新裝入一個新的數組,這是ArrayList最壞的一種狀況,時間複雜度是O(n),而LinkedList中插入或刪除的時間複雜度僅爲O(1)。ArrayList在插入數據時還須要更新索引(除了插入數組的尾部)。
3) 相似於插入數據,刪除數據時,LinkedList也優於ArrayList。數據結構

  • ArrayList 與 Vector 區別

首先看這兩類都實現List接口,而List接口一共有三個實現類,分別是ArrayList、Vector和LinkedList。List用於存放多個元素,可以維護元素的次序,而且容許元素的重複。相關區別以下:多線程

一、Vector與ArrayList同樣,都是經過數組實現的,不一樣的是它支持線程的同步,即某一時刻只有一個線程可以寫Vector,避免多線程同時寫而引發的不一致性,但實現同步須要很高的花費,所以,訪問它比訪問ArrayList慢。
二、ArrayList在內存不夠時默認是擴展50% + 1個,Vector是默認擴展1倍。併發

  • HashMap、ConcurrentHashMap、HashTable的區別

引入ConcurrentHashMap是爲了在同步集合HashTable之間有更好的選擇,HashTable與HashMap、ConcurrentHashMap主要的區別在於HashMap不是同步的、線程不安全的和不適合應用於多線程併發環境下,而ConcurrentHashMap是線程安全的集合容器,特別是在多線程和併發環境中,一般做爲Map的主要實現。性能

一、第一個重要的區別就是ConcurrentHashMap是線程安全的和在併發環境下不須要加額外的同步。雖然它不像Hashtable那樣須要一樣的同步等級(全表鎖),但也有不少實際的用途。
二、你可使用Collections.synchronizedMap(HashMap)來包裝HashMap做爲同步容器,這時它的做用幾乎與Hashtable同樣,當每次對Map作修改操做的時候都會鎖住這個Map對象,而ConcurrentHashMap會基於併發的等級來劃分整個Map來達到線程安全,它只會鎖操做的那一段數據而不是整個Map都上鎖。
三、ConcurrentHashMap有很好的擴展性,在多線程環境下性能方面比作了同步的HashMap要好,可是在單線程環境下,HashMap會比ConcurrentHashMap好一點。線程

總結一下以上二者的區別,它們在線程安全、擴展性、同步之間的區別。若是是用於緩存的話,ConcurrentHashMap是一個更好的選擇,在Java應用中會常常用到。

四、Hashtable是jdk1的一個遺棄的類,它把全部方法都加上synchronized關鍵字來實現線程安全。全部的方法都同步這樣形成多個線程訪問效率特別低。Synchronized Map與HashTable差異不大,也是在併發中做相似的操做,二者的惟一區別就是Synchronized Map沒被遺棄,它能夠經過使用Collections.synchronizedMap()來包裝Map做爲同步容器使用。

  • HashMap 的工做原理及代碼實現,何時用到紅黑樹

HashMap工做原理及何時用到的紅黑樹:
在jdk 1.7中,HashMap採用位桶+鏈表實現,即便用鏈表處理衝突,同一hash值的鏈表都存儲在一個鏈表裏。可是當位於一個桶中的元素較多,即hash值相等的元素較多時,經過key值依次查找的效率較低。
在jdk 1.8中,HashMap採用位桶+鏈表+紅黑樹實現,當鏈表長度超過閾值(8)時,將鏈表轉換爲紅黑樹,這樣大大減小了查找時間。

原理:
數組中的每個元素所在的位置至關於一個位桶,添加元素的時候,首先計算元素key的hash值,肯定插入數組中的位置(也就是哪一個桶中),若是存在相同的hash值,則放在同一個桶中(元素位置)造成鏈表,當鏈表長度超過閾值(8)時,將鏈表轉換爲紅黑樹;

內部結構:
一、HashMap 底層是基於數組和鏈表實現的,如圖所示,其中兩個重要的參數:容量和負載因子;容量的默認大小是 16,負載因子是 0.75,當 HashMap 的 size > 16*0.75 時就會發生擴容(容量和負載因子均可以自由調整)。
二、內部包含了一個Node類型的數組 table(Entry<K,V>[] table爲jdk 1.7中)。
三、Node存儲着鍵值對。它包含了四個字段,從 next 字段咱們能夠看出Node是一個鏈表。即數組中的每一個位置被當成一個桶,一個桶存放一個鏈表。HashMap 使用拉鍊法來解決衝突,同一個鏈表中存放哈希值相同的Node;

拉鍊法的工做原理(解決hash衝突):
新建一個 HashMap,默認大小爲 16;
插入 <K1,V1> 鍵值對,先計算 K1 的 hashCode 爲 115,使用除留餘數法獲得所在的桶下標 115%16=3。
插入 <K2,V2> 鍵值對,先計算 K2 的 hashCode 爲 118,使用除留餘數法獲得所在的桶下標 118%16=6。
插入 <K3,V3> 鍵值對,先計算 K3 的 hashCode 爲 118,使用除留餘數法獲得所在的桶下標 118%16=6,插在 <K2,V2> 前面。
應該注意到鏈表的插入是以頭插法方式進行的,例如上面的 <K3,V3> 不是插在 <K2,V2> 後面,而是插入在鏈表頭部;

查找須要分紅兩步進行:
一、計算鍵值對所在的桶;
二、在鏈表上順序查找,時間複雜度顯然和鏈表的長度成正比;
HashMap 容許插入鍵爲 null 的鍵值對。可是由於沒法調用 null 的 hashCode() 方法,也就沒法肯定該鍵值對的桶下標,只能經過強制指定一個桶下標來存放。HashMap 使用第 0 個桶存放鍵爲 null 的鍵值對。

  • 多線程狀況下HashMap死循環的問題

若是擴容前相鄰的兩個Entry在擴容後仍是分配到相同的table位置上,就會出現死循環的BUG。在複雜的生產環境中,這種狀況儘管不常見,可是可能會碰到。

  • HashMap出現Hash DOS攻擊的問題

  • ConcurrentHashMap 的工做原理及代碼實現,如何統計全部的元素個數

  • 看過那些Java集合類的源碼

  • 手寫簡單的HashMap
相關文章
相關標籤/搜索