1. 程式人生 > >java面試之集合類

java面試之集合類

1、結構圖:

|---Collection<E>:儲存一組物件

|------List:可重複,可以有序

|---------LinkedList:雙向連結串列,插入、刪除。移動操作較快,隨機訪問操作差

|---------ArrayList:陣列方式,擅長隨機訪問,但是插入、刪除、移動操作慢

|---------Vector:陣列方式,執行緒安全,與ArrayList的區別就是執行緒安全

|------------Stack:實現棧

|------Set:不可重複

|---------HashSet:雜湊表實現,無序

|---------TreeSet:紅黑樹實現,排序

|----

--Queue:先進先出容器

|---------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的時候包含一個集合快照。通常在遍歷一個

Iterator的時候不建議修改集合本身。(主要的方法有:next()hasNext()remove()

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作為新集合框架的一部分在Java21.2版本中加入。它們之間有一下區別:

  • HashMapHashtable大致是等同的,HashMap是非同步的和且允許鍵和值都是空值。
  • HashTable使用Enumeration遍歷,而HashMap使用Iterator遍歷(Enumerationiterator的區別是iterator可以刪除元素,現在一般用Iterator)。
  • HashTablehash陣列的預設大小事11,增加方式是old*2+1,而HashMaphash陣列的預設大小事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元素的時候,先根據keyhashcode得到這個元素在陣列中的位置(即下標),然後就可以把這個元素放到對應的位置中了。如果這個元素所在的位子上已經存放有其他元素了,那麼在同一個位子上的元素將以連結串列的形式存放,新加入的放在鏈頭,最先加入的放在鏈尾。

從hashmap中get元素時,首先計算keyhashcode,找到陣列中對應位置的某一元素,然後通過keyequals方法在對應位置的連結串列中找到需要的元素。

  • key的hashcode與equals方法改寫

HashMap中get方法的過程:首先計算key的hashcode,找到陣列中對應位置的某一元素,然後通過key的equals方法在對應位置的連結串列中找到需要的元素。所以,hashcodeequals方法對於找到對應元素是兩個關鍵方法。 

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演算法