java面試之集合類
1、結構圖:
|---Collection<E>:儲存一組物件
|------List:可重複,可以有序
|---------LinkedList:雙向連結串列,插入、刪除。移動操作較快,隨機訪問操作差
|---------ArrayList:陣列方式,擅長隨機訪問,但是插入、刪除、移動操作慢
|---------Vector:陣列方式,執行緒安全,與ArrayList的區別就是執行緒安全
|------------Stack:實現棧
|------Set:不可重複
|---------HashSet:雜湊表實現,無序
|---------TreeSet:紅黑樹實現,排序
|----
|---------PriorityQueue:不允許null,按照所指定順序對元素排序,非執行緒安全
|---Map<K, V>:儲存關鍵字/值對
|------HashMap:允許有Null,非執行緒安全
|------HashTable:不允許有Null(已被HashMap代替),執行緒安全
|------TreeMap:有序(Comparable制定)
|---Interator<E>:迭代輸出,新輸出標準,較Enumeration<E>增加一個remove()方法
|---Enumeration<E>:舊的輸出標準
- 幫助理解:
Map中的一組方法允許您把鍵或值的組作為集合來處理。
publicSet keySet() //不可重複
publicCollection values() //可重複
public SetentrySet() //一個實現 Map.Entry 介面(包含getKey/getValue/hasCode/setValue/equals方法)的元素 Set
2、注意知識點
2.1、什麼是Iterator
一些集合類提供了內容遍歷的功能,通過java.util.Iterator介面。這些介面允許遍歷物件的集合。依次操作每個元素物件。當使用 Iterators時,在獲得Iterator的時候包含一個集合快照。通常在遍歷一個
2.2、Iterator與ListIterator有什麼區別?
Iterator:只能正向遍歷集合,適用於獲取移除元素。ListIerator:繼承Iterator,可以雙向列表的遍歷,同樣支援元素的修改。
2.3、Iterator與Iterable介面的區別
- 從介面定義的方法看:
Iterator介面:hasNext、next 、remove
Iterable介面:iterator
- 從功能看:
Iterator介面實現之後的功能是“使用”一個迭代器
Iterable介面實現之後的功能是“返回”一個迭代器
2.4、什麼是HaspMap和Map?
Map是介面,Java 集合框架中一部分,用於儲存鍵值對,HashMap是用雜湊演算法實現Map的類。
2.5、HashMap與HashTable有什麼區別?對比Hashtable VS HashMap
兩者都是用key-value方式獲取資料。Hashtable是原始集合類之一(也稱作遺留類)。HashMap作為新集合框架的一部分在Java2的1.2版本中加入。它們之間有一下區別:
- HashMap和Hashtable大致是等同的,HashMap是非同步的和且允許鍵和值都是空值。
- HashTable使用Enumeration遍歷,而HashMap使用Iterator遍歷(Enumeration和iterator的區別是iterator可以刪除元素,現在一般用Iterator)。
- HashTable中hash陣列的預設大小事11,增加方式是old*2+1,而HashMap中hash陣列的預設大小事16,而且一定是2的指數。
- 雜湊值的使用不同,HashTable直接使用物件的hashcode,而HashMap會重新計算hash值。
2.6、Collections和Collection的區別:
Collections是集合類(Collection是個java.util下的介面,它是各種集合結構的父介面。Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。
2.7、Comparable和Comparator介面的區別
- 從介面定義的方法:
Comparable介面:compareTo(arg)
Comparator介面:compare(arg1, arg2)、equals(arg1, arg2)
- 從需求:
Comparable介面是比較類需要實現的介面
Comparator介面的實現類是比較器
- 從用法:
自定義的類要在加入list容器中後能夠排序,可以實現Comparable介面,在用Collections類的sort方法排序時,如果不指定Comparator,那麼就以自然順序排序;
而Comparator 是一個專用的比較器,當這個物件不支援自比較或者自比較函式不能滿足你的要求時,你可以寫一個比較器來完成兩個物件之間大小的比較。
一個是自已完成比較,一個是外部程式實現比較的差別而已。
- Comparator介面例項(類的設計師沒有考慮到比較問題而沒有實現Comparable,可以通過Comparator來實現排序而不必改變物件本身,實現演算法和資料分離,策略設計模式):
- Comparabler介面例項:
3、hashcode
3.1、常用hashcode演算法
- Object類的hashCode:返回物件的記憶體地址經過處理後的結構,由於每個物件的記憶體地址都不一樣,所以雜湊碼也不一樣。
- String類的hashCode:根據String類包含的字串的內容,根據一種特殊演算法返回雜湊碼,只要字串內容相同,返回的雜湊碼也相同。
- Integer類,返回的雜湊碼就是Integer物件裡所包含的那個整數的數值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可見,2個一樣大小的Integer物件,返回的雜湊碼也一樣。
3.2、hashcode與HashTable、HashMap
- HashMap結構圖(連結串列雜湊):
從圖中我們可以看到一個hashmap就是一個數組結構,當新建一個hashmap的時候,就會初始化一個數組Entry[] table。其中Entry是陣列的元素,
Entry還持有一個指向下一個元素的引用,這就構成了連結串列。
- HashMap工作原理(put/get):
當我們往hashmap中put元素的時候,先根據key的hashcode得到這個元素在陣列中的位置(即下標),然後就可以把這個元素放到對應的位置中了。如果這個元素所在的位子上已經存放有其他元素了,那麼在同一個位子上的元素將以連結串列的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾。
從hashmap中get元素時,首先計算key的hashcode,找到陣列中對應位置的某一元素,然後通過key的equals方法在對應位置的連結串列中找到需要的元素。
- key的hashcode與equals方法改寫
HashMap中get方法的過程:首先計算key的hashcode,找到陣列中對應位置的某一元素,然後通過key的equals方法在對應位置的連結串列中找到需要的元素。所以,hashcode與equals方法對於找到對應元素是兩個關鍵方法。
Hashmap的key可以是任何型別的物件,例如User這種物件,為了保證兩個具有相同屬性的user的hashcode相同,我們就需要改寫hashcode方法,比方把hashcode值的計算與User物件的id關聯起來,那麼只要user物件擁有相同id,那麼他們的hashcode也能保持一致了,這樣就可以找到在hashmap陣列中的位置了。
如果這個位置上有多個元素,還需要用key的equals方法在對應位置的連結串列中找到需要的元素,所以只改寫了hashcode方法是不夠的,equals方法也是需要改寫。
只重寫了equasl方法的Key類在用做Hash中的鍵值的時候兩個equasl為true的物件不能獲取相應的Value的;
而重寫了hashCode方法和equals方法的key_類兩個相等的物件可以獲取同一個Value的,這樣更符合生活中的邏輯。
HashMap物件是根據Key的hashCode來獲取對應的Vlaue,因而兩個HashCode相同的物件可以獲取同一個Value。
- HashMap中的hash演算法