寫在以前:
這篇文章是本身面試過程當中,總結出來的關於Java集合類的總結。每次面試以前來出來看看,速度快,也能很迅速的回憶一些細節問題。發佈這篇文章,不單單是但願你們「臨陣磨槍」,更但願你們可以以此學習其內在原理。畢竟,源碼纔是最正確的。java
問題彙總:
1.ArrayList
- 實現方式:數組;
- 超出容量的話,增長50%,使用System.arraycopy()複製到新的數組;
- 默認容量爲10
- get()和set()性能很高,可是add()/remove()性能差。
2.LinkedList
- 實現方式:雙向循環鏈表;
- 沒有容量限制;
- get()和set()性能差,可是add()/remove()性能很快。
3.Vector
- 與ArrayList相似
- 線程同步
- 使用Iterator方式遍歷
- 自動增加原來一倍的數組長度
4.HashMap
- 實現方式:Entry[]數組實現的哈希桶數組;
- 初始容量爲16,填充因子爲0.7,擴容爲2倍
- 用Key的哈希值取模桶數組的大小可獲得數組下標;
- 計算hash對key的hashcode進行了二次hash,以得到更好的散列值,而後對table數組長度取摸
- Entry用一個next屬性實現多個Entry以單向鏈表存放;
- JDK8裏,當一個桶裏的Entry超過8後,就不以單向鏈表而以紅黑樹來存放以加快Key的查找速度。
5.HashMap和HashTable區別
- HashTable的方法前面都有synchronized來同步,是線程安全的;HashMap未經同步,是非線程安全的。
- HashTable不容許null值(key和value都不能夠) ;HashMap容許null值(key和value均可以)。
- HashTable有一個contains(Objectvalue)功能和containsValue(Objectvalue)功能同樣。
- HashTable使用Enumeration進行遍歷;HashMap使用Iterator進行遍歷。
- HashTable中hash數組默認大小是11,增長的方式是old*2+1;HashMap中hash數組的默認大小是16,並且必定是2的指數。
- 哈希值的使用不一樣,HashTable直接使用對象的hashCode; HashMap從新計算hash值,並且用與代替求模。
6.Collection和Collections的區別
- java.util.Collection 是一個集合接口。它提供了對集合對象進行基本操做的通用接口方法。Collection接口在Java 類庫中有不少具體的實現。Collection接口的意義是爲各類具體的集合提供了最大化的統一操做方式。
- java.util.Collections 是一個包裝類。它包含有各類有關集合操做的靜態多態方法。此類不能實例化,就像一個工具類,服務於Java的Collection框架。
7.HashMap爲何容量是2的冪次
8.hashCode和equals方法的關係
- equals相等,hashcode必相等;hashcode相等,equals可能不相等。
9.Java集合類框架的基本接口
- Collection:表明一組對象,每個對象都是他的子元素;
- Set:不包含重複元素的Collection;
- List:有序的Collection,能夠包含重複元素;
- Map:將key映射到value的對象,key不能重複。
10.Enumeration接口與Iterator接口的區別
- Enumeration接口比Iterator速率的2倍
- Iterator線程比Enumeration安全