JAVA面試常見問題之常見集合篇

一、List 和 Set 區別html

  • List
    • 能夠容許重複的對象。
    • 能夠插入多個null元素。
    • 有序容器
  • Set
    • 不容許重複的對象。
    • 只能插入1個null元素
    • 無序容器,可使用TreeSet實現有序

二、Set和hashCode以及equals方法的聯繫數組

      set集合中存放的數據有一個特色,那就是無序且不重複。無序是由於set集合中的元素沒有下座標。不重複的緣由就是由於set集合中有hashcode與equals這兩個方法。安全

三、List 和 Map 區別數據結構

  • 結構:List爲單列結構,Map爲雙列結構
  • 重複性:List爲能夠重複,Map爲雙列集合(key-value),key不能夠重複
  • 有序性:List爲有序集合,Map的key是無序的

四、Arraylist 與 LinkedList 區別多線程

  • 數據結構:ArrayList基於動態數組的數據結構。LinkedList基於鏈表的數據結構。
  • 操做性ArrayList查詢快,增刪慢,LinkedList查詢慢,增刪快。

五、ArrayList 與 Vector 區別併發

  • 同步性Vector線程安全,用synchronized實現線程安全。ArrayList線程不安全。
  • 數據容量增加:兩者都有一個初始容量大小,採用線性連續存儲空間,當存儲的元素的個數超過了容量時,就須要增長兩者的存儲空間,Vector增加原來的一倍,ArrayList增長原來的0.5倍。

六、HashMap 和 Hashtable 的區別高併發

  • 繼承不一樣父類:Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類。但兩者都實現了Map接口。
  • 線程安全:Hashtable線程安全,HashMap線程不安全。
  • 是否提供contains方法: HashMap把Hashtable的contains方法去掉了,改爲containsValue和containsKey。Hashtable則保留了contains,containsValue和containsKey三個方法,其中contains和containsValue功能相同。
  • key和value的是否能夠爲null值:Hashtable中,key和value都不容許出現null值。HashMap中,null能夠做爲鍵,這樣的鍵只有一個;能夠有一個或多個鍵所對應的值爲null。

七、HashSet 和 HashMap 區別性能

*HashMap* *HashSet*
HashMap實現了Map接口 HashSet實現了Set接口
HashMap儲存鍵值對 HashSet僅僅存儲對象
使用put()方法將元素放入map中 使用add()方法將元素放入set中
HashMap中使用鍵對象來計算hashcode值 HashSet使用成員對象來計算hashcode值,對於兩個對象來講hashcode可能相同,因此equals()方法用來判斷對象的相等性,若是兩個對象不一樣的話,那麼返回false
HashMap比較快,由於是使用惟一的鍵來獲取對象 HashSet較HashMap來講比較慢

 八、HashMap 和 ConcurrentHashMap 的區別spa

  • 線程安全性:HashMap線程不安全,ConcurrentHashMap線程安全
  • ConcurrentHashMap特性:性能與安全性兼得。加入分段鎖的概念,至關於一個大集合,根據hashcode值分紅多個hashtable,根據key.hashCode()來決定把key放到哪一個HashTable中。

九、HashMap 的工做原理及代碼實現,何時用到紅黑樹.net

  • 工做原理:經過hash的方法,經過put和get存儲和獲取對象。存儲對象時,咱們將K/V傳給put方法時,它調用hashCode計算hash從而獲得bucket位置,進一步存儲,HashMap會根據當前bucket的佔用狀況(當鍵值對的數量大於容量(capacity)*負載因子(load factor 默認值0.75)時)自動調整容量(超過Load Facotr則resize爲原來的2倍)。獲  取對象時,咱們將K傳給get,它調用hashCode計算hash從而獲得bucket位置,並進一步調用equals()方法肯定鍵值對。若是發生碰撞的時候,Hashmap經過鏈表將產生碰撞衝突的元素組織起來,在Java 8中,若是一個bucket中碰撞衝突的元素超過某個限制(默認是8),則使用紅黑樹來替換鏈表,從而提升速度。
  • 代碼實現:參考 http://www.cnblogs.com/mzc-blogs/p/5800084.html, 也能夠直接查看源碼
  • 何時用到紅黑樹:當鏈表(bucket)的數量大於8時,後面的使用紅黑樹。使用紅黑樹增長檢索的速度。

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

  • 緣由:HashMap是採用鏈表解決Hash衝突,由於是鏈表結構,那麼就很容易造成閉合的鏈路(緣由:多線程操做時,可能會有兩個或以上的線程同時觸發rehash--從新計算hash值--操做,容易形成閉合的鏈路),這樣在循環的時候只要有線程對這個HashMap進行get操做就會產生死循環。
  • 解決思路:用ConcurrentMap代替HashMap

十一、HashMap出現Hash DOS攻擊的問題

  • 緣由:

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

  • ConcurrentHashMap工做原理容器中有多把鎖,每一把鎖鎖一段數據,這樣在多線程訪問時不一樣段的數據時,就不會存在鎖競爭了,這樣即可以有效地提升併發效率。這就是ConcurrentHashMap所採用的"分段鎖"思想。
  • 代碼實現:參考https://www.cnblogs.com/chengxiao/p/6842045.html 或查看源碼
  • 如何統計全部的元素個數:size()

1三、手寫簡單的HashMap

   參考:    https://blog.csdn.net/lishaoran369/article/details/61920036

相關文章
相關標籤/搜索