聲明,本文用的是jdk1.8
花了一個星期,把Java容器核心的知識過了一遍,感受集合已經無所畏懼了!!(哈哈哈....),如今來總結一下吧~~java
回顧目錄:面試
Java容器可分爲兩大類:數組
Collection安全
List微信
Set多線程
HashSet併發
Mapapp
HashMap框架
着重標出的那些就是咱們用得最多的容器。工具
其實,我也不知道要怎麼總結好,由於以前寫每一篇的時候都總結過了。如今又把他們從新羅列出來好像有點水,因此,我決定去回答一些Java容器的面試題!
固然了,個人答案未必就是正確的。若是有錯誤的地方你們多多包含,但願不吝在評論區留言指正~~
共同點:
區別:
同步性:
擴容大小:
共同點:
區別:
同步性:
是否容許爲null:
contains方法
繼承不一樣:
共同點:
不一樣點:
存儲結構不一樣:
元素是否可重複:
是否有序:
咱們知道Set集合實際大都使用的是Map集合的put方法來添加元素。
以HashSet爲例,HashSet裏的元素不能重複,在源碼(HashMap)是這樣體現的:
// 1. 若是key 相等 if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p; // 2. 修改對應的value if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue; }
添加元素的時候,若是key(也對應的Set集合的元素)相等,那麼則修改value值。而在Set集合中,value值僅僅是一個Object對象罷了(該對象對Set自己而言是無用的)。
也就是說:Set集合若是添加的元素相同時,是根本沒有插入的(僅修改了一個無用的value值)!從源碼(HashMap)中也看出來,==和equals()方法都有使用!
ArrayList的底層是數組,LinkedList的底層是雙向鏈表。
ArrayList的增刪未必就是比LinkedList要慢。
若是刪除操做的位置是在中間。因爲LinkedList的消耗主要是在遍歷上,ArrayList的消耗主要是在移動和複製上(底層調用的是arraycopy()方法,是native方法)。
這個我在前面的文章中也沒有詳細去講它們,只是大概知道的是:Iterator替代了Enumeration,Enumeration是一箇舊的迭代器了。
與Enumeration相比,Iterator更加安全,由於當一個集合正在被遍歷的時候,它會阻止其它線程去修改集合。
區別有三點:
看一下源碼的方法就知道了:
Java1.5併發包(java.util.concurrent)包含線程安全集合類,容許在迭代時修改集合。
一部分類爲:
須要同時重寫該類的hashCode()方法和它的equals()方法。
通常來講,咱們會認爲:只要兩個對象的成員變量的值是相等的,那麼咱們就認爲這兩個對象是相等的!由於,Object底層比較的是兩個對象的地址,而對咱們開發來講這樣的意義並不大~這也就爲何咱們要重寫equals()
方法
重寫了equals()方法,就要重寫hashCode()的方法。由於equals()認定了這兩個對象相同,而同一個對象調用hashCode()方法時,是應該返回相同的值的!
肯定完咱們的集合類型,咱們接下來肯定使用該集合類型下的哪一個子類~我認爲能夠簡單分紅幾個步驟:
是否須要同步
迭代時是否須要有序(插入順序有序)
是否須要排序(天然順序或者手動排序)
ArrayList的默認初始容量爲10,要插入大量數據的時候須要不斷擴容,而擴容是很是影響性能的。所以,如今明確了10萬條數據了,咱們能夠直接在初始化的時候就設置ArrayList的容量!
這樣就能夠提升效率了~
2018年4月15日17:14:03,上面找了一些面試題答了一下,感受不夠過癮呀。不少我以爲比較重要的知識點我都沒有找到對應的面試題(可能我搜索的能力太水了?)。
將這篇文章做爲集合的總結篇,但以爲沒什麼好寫就回答一些面試題去了,找了一會面試題又以爲不夠系統。而這篇總結我又不想複製前面的章節總結到這裏來。因而我決定畫一個腦圖來結束這篇文章!
2018年4月15日19:31:33 畫完啦!!!!!
須要更多腦圖的同窗可關注公衆號:Java3y,回覆【腦圖】便可~
若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠 關注微信公衆號:Java3y。爲了你們方便,剛新建了一下 qq羣:742919422,你們也能夠去交流交流。謝謝支持了!但願能多介紹給其餘有須要的朋友
文章的目錄導航:https://zhongfucheng.bitcron.com/post/shou-ji/wen-zhang-dao-hang
目前初步打算寫多線程,大家以爲怎麼樣呢?能夠在評論區留言~