Java容器面試題——查缺補漏

目錄

18.Java容器都有哪些?

19.Collection 和 Collections 有什麼區別?

20.  List  Set  Map  之間的區別是什麼?

21.HashMap 和Hashtable 有什麼區別?

22.如何決定使用HashMap還是TreeMap?

23.說一下HashMap的實現原理?

24.說一下HashSet的實現原理?

25.ArrayList 和 LinkedList的區別是什麼?

26.如何實現數組和List之間的轉換?

27.ArrayList 和 Vector的區別是什麼?

28.Array 和ArrayList有什麼區別?

29.在Queue中poll( )和remove( )有什麼區別?

30.哪些集合類是線程安全的?

31.迭代器Iterator是什麼?

32.Iterator怎麼使用?有什麼特點?

33.Iterator和ListIterator有什麼區別?

 另附個人總結常見集合表:


18.Java容器都有哪些?

 

19.Collection 和 Collections 有什麼區別?

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

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

 

20.  List  Set  Map  之間的區別是什麼?

 

21.HashMap 和Hashtable 有什麼區別?

(1)HashMap非線程安全的;Hashtable是線程安全的

(2)HashMap是非同步的;Hashtable是同步的

(3)HashMap允許空鍵值;Hashtable不允許空鍵值

(4)HashMap去掉了Hashtable的contains( )方法,但是加上了containsValue( )和containsKey( )方法

(5)HashMap初始化容量爲16,擴容是原來的兩倍;HashMap初始化容量爲11,擴容是原來的 *2+1

22.如何決定使用HashMap還是TreeMap?

對於Map中插入、刪除和定位元素這類操作,HashMap是最好的選擇。

然而假如你需要對一個有序的key集合進行遍歷,TreeMap是更好的選擇

 

23.說一下HashMap的實現原理?

(1)HashMap概述:是基於哈希表的Map接口的非同步實現。此實現提供所有可選的映射操作,並允許鍵值使用null。此類不保證映射的順序,也就是無序的!   特點即:無序不可重複!

(2)HashMap的數據結構:“哈希表單向鏈表”數據結構,即數組和鏈表的結合體

(3)map.put(k, v)實現原理:先將k,v封裝到Node對象上,如何調用k的hashCode()方法得出哈希值,然後通過哈希算法轉換爲數組的下標。如果下標位置上沒有元素,就把Node添加到這個位置;如果說下標位置上有鏈表,此時會拿着k和鏈表上每一個節點的k進行equals(),如果所有的equals()都返回false,則新節點將被添加到鏈表的末尾;如果其中一個equals()返回true,那麼這個節點的value將會被覆蓋。

(4)map.get( k )實現原理:先調用k的hashCode()方法得出哈希值,通過哈希算法轉換爲數組的下標,通過數組下標可以快速定位到某個位置上,如果這個位置上什麼也沒有,則get方法返回null;如果這個位置上有單向鏈表,那麼會拿着k和鏈表上的每個節點的k進行equals(),如果都返回false,那麼get方法返回null;只要其中一個節點的k跟參數k的equals()返回true,那麼這個節點的value就是我們要找的value,get方法最終返回這個value。

(5)注意jdk1.8對HashMap進行了優化:如果單向鏈表的節點個數超過八個,則會轉變爲紅黑樹來提高查詢效率,從原來的 O( n )到 O( logn );當紅黑樹上節點少於六個的時候,重新將紅黑樹轉換爲單向鏈表。

24.說一下HashSet的實現原理?

(1)HashSet底層由HashMap實現

(2)HashSet的值放在HashMap的key上

(3)HashMap的value統一爲PRESENT

(4)特點:無序不可重複

25.ArrayList 和 LinkedList的區別是什麼?

(1)最明顯的區別就是底層數據結構不同:ArrayList底層是數組、LinkedList底層是雙向鏈表。

(2)ArrayList 查找的時間複雜度爲O( 1 ) ; LinkedList 查找的時間複雜度爲 O( n )

26.如何實現數組和List之間的轉換?

(1)List轉換爲數組:調用ArrayList的toArray( )方法

(2)數組轉換爲List:調用Arrays的asList( )方法

27.ArrayList 和 Vector的區別是什麼?

(1)ArrayList是非線程安全的;Vector是線程安全的

(2)ArrayList比Vector效率高。

(3)ArrayList更加通用,我們可以通過Collections工具類輕易的獲取同步列表和只讀列表

28.Array 和ArrayList有什麼區別?

(1)Array可以容納基本類型和對象;ArrayList只能存儲對象

(2)Array是指定大小的,而ArrayList大小是固定的

(3)Array沒有提供ArrayList那麼多功能,比如addAll( )、removeAll( )、iterator( )等

29.在Queue中poll( )和remove( )有什麼區別?

poll( ) remove( )都是從隊列中取出一個元素,但是poll( )在獲取失敗的時候會返回空,而remove( )失敗會拋出異常。

30.哪些集合類是線程安全的?

(1)Vector:效率太低

(2)Statck:堆棧類,先進後出

(3)Hashtable:比HashMap多了一個線程安全

(4)Properties:key-value只支持String類型

(5)enumeration:枚舉,相當於迭代器

31.迭代器Iterator是什麼?

迭代器是一種設計模式,它是一個對象,它可以遍歷並選擇序列中的對象,而開發人員不需要了解該序列的底層結構。迭代器通常被稱爲“輕量級”對象,因爲創建它的代價小。

32.Iterator怎麼使用?有什麼特點?

特點:單向移動!!

(1)使用方法iterator( ) 要求容器返回一個Iterator。第一次調用Iterator的next()方法時,返回的是第一個元素。注意:iterator() 是java.lang.Iterable接口,被Collection繼承。

(2)使用next()獲取下一個元素

(3)使用hasNext()檢查序列是否還有下一個元素

(4)使用remove()將迭代器新返回的元素刪除。

注意:Iterator是Java迭代器最簡單的實現,爲List設計的ListIterator具有更多的功能,它可以從兩個方向遍歷List,也可以從List中插入和刪除元素。

33.Iterator和ListIterator有什麼區別?

(1)Iterator用來遍歷Set和List集合。但是ListIterator只能用來遍歷List

(2)Iterator對集合只能是前向遍歷,ListIterator既可以前向也可以後向

(3)ListIterator實現了Iterator接口,幷包含其他的功能,比如:增加元素、替換元素、獲取前一個後後一個的索引.....

 另附個人總結常見集合表:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章