目錄
19.Collection 和 Collections 有什麼區別?
25.ArrayList 和 LinkedList的區別是什麼?
29.在Queue中poll( )和remove( )有什麼區別?
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接口,幷包含其他的功能,比如:增加元素、替換元素、獲取前一個後後一個的索引.....
另附個人總結常見集合表: