Java面試整理-基礎篇8.集合1

1.Java中常見的集合及其關係?


Java面試整理-基礎篇8.集合1


2.ArrayList、LinkedList、Vector的區別?

1. LinkedList、ArrayList、Vector都是List接口的子類;LinkedList基於雙向鏈表實現,ArrayList、Vector基於數組實現。

2. ArrayList採用懶加載模式,在第一次添加元素時,初始化內部數組,初始大小為10,擴容大小為原先為1.5倍,採用異步處理,線程不安全,性能較高,在大部分場景下適用。

3. Vector在產生對象時,初始化一個大小為10的內部數組、擴容為原先的2倍,採用synchronized修飾常用的crud方法,線程安全,性能較低(讀讀互斥)。

4. ArrayList和LinkedList由於實現原理的不同(雙向鏈表和數組),常見的插入刪除在尾部時使用ArrayList比較快,在指定位置的時候使用LinkedList。


3.通過Collections.SynchornizedList、Vector的區別?

1. 通過
Collections.synchronizedList()方法可以將線程不安全的List轉成線程安全的List。

2.
Collections.SynchronizedList使用了委託(delegation),實質上存儲使用的是構造時傳入的list,只是將list作為底層存儲。
Collections.SynchronizedList使用synchronized代碼塊對mutex對象加鎖,mutex對象可以通過構造函數傳入,也就是可以指定鎖定的對象。

3. Vector則是對整個方法使用了synchronized,所以不能對同步進行細粒度的控制。而且同步方法加鎖的是this對象,沒辦法控制鎖定的對象。

4. 由於
Collections.SynchronizedList比Vector多了一層封裝,所以Vecgor比
Collections.SynchronizedList的效率略高。


4.Set和List的區別?

1. List允許插入重複的元素,Set不允許重複元素。

2. List是有序集合,會保留元素插入時的順序,Set是無序集合。

3. List可以通過下標來訪問,Set不能。


5.Set是如何保證元素不重複的?

Set根據實現方式主要分為兩大類,HashSet和TreeSet。

1. HashSet是由哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重複,就如數據庫中唯一約束。

2. TreeSet是由二差樹實現的,Treeset中的數據是自動排好序的,不允許放入null值。


6.Collection和Collections的區別

1. java.util.Collection是一個集合接口(集合類的頂級接口)。提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java類庫中有很多具體的實現。Collection接口的意義是為各種具體的集合提供了最大化的統一操作方式,其直接繼承接口有List與Set。

2. Collections則是集合類的一個工具類,提供了一系列靜態方法,用於對集合中元素進行排序、搜索以及線程安全等各種操作。


7.Arrays.asList獲得的List使用時有什麼需要注意的?

1. 在使用Arrays.asList()後調用add,remove這些method時出現
java.lang.UnsupportedOperationException。因為Arrays.asList()返回的是java.util.Arrays$ArrayList而不是ArrayList。

2. Arrays$ArrayList和ArrayList都繼承AbstractList,而remove,add等method在AbstractList中默認實現僅有`throw new
UnsupportedOperationException();`而不做其他處理。ArrayList繼承AbstractList後重寫(override)了這些方法,而Arrays$ArrayList則是保留了默認實現拋出
java.lang.UnsupportedOperationException。
## 附言

* 轉載請註明出處

* 更多文章,請關注公眾號《百育科技》,公眾號會定期按系列整理文章



分享到:


相關文章: