Java 集合常見知識點彙總#
- ArrayList 和 Vector 的區別
- List,Set,Map 三者的區別
- Set 裡的元素是不能重複的,用什麼方法來區分重複與否
- ArrayList,LinkedList 區別
- Collection 和 Collections 的區別
- Enumeration 和 Iterator 接口的區別
- ListIterator 有什麼特點
- Java 集合的 fail-fast 快速失敗機制
- comparable 和 Comparator 的區別
一、ArrayList 和 Vector 的區別#
- ArrayList 是非同步的, Vector 是同步的
- 擴容大小不同:Vector 增長原來的一倍,ArrayList 增長原來的 0.5 倍
二、List,Set,Map 三者的區別#
List
:List 接口存儲一組不唯一(可以有多個元素引用相同的對象),有序的對象Set
: 不允許重複的集合。不會有多個元素引用相同的對象。Map
: 使用鍵值對存儲。Map 會維護與 Key 關聯的值。兩個 Key 可以引用相同的對象,但 Key 不能重複,典型的 Key 是 String 類型,但也可以是任何對象
三、Set 裡的元素是不能重複的,用什麼方法來區分重複與否#
判斷 key 是否存在,== 和 equals () 方法都有使用。如果添加的元素相同時,是沒有插入的,而是直接修改了 value 值
== 與 equals 的區別#
==
是判斷兩個變量或實例是不是指向同一個內存空間,equals 是判斷兩個變量或實例所指向的內存空間的值是不是相同==
是指對內存地址進行比較,equals () 是對字符串的內容進行比較==
指引用是否相同,equals () 指的是值是否相同
HashSet 是如何保證數據不可重複的?#
當你把對象加入 HashSet 時,HashSet 會先計算對象的 hashcode 值來判斷,如果發現有相同 hashcode 值的對象,這時會調用 equals()方法來檢查 hashcode 相等的對象是否真的相同
四、ArrayList,LinkedList 區別#
- Arraylist 底層使用的是
Object 陣列
; LinkedList 底層使用的是雙向鏈表
數據結構(JDK1.6 之前為循環鏈表,JDK1.7 取消了循環) - LinkedList 不支持高效的隨機元素訪問,而 ArrayList 支持,快速隨機訪問就是通過元素的序號快速獲取元素對象 (對應於 get (int index) 方法)
- 內存空間佔用: ArrayList 的空間浪費主要體現在在 list 列表的結尾會預留一定的容量空間,而 LinkedList 的空間花費則體現在它的每一個元素都需要消耗比 ArrayList 更多的空間(因為要存放直接後繼和直接前驅以及數據)
五、Collection 和 Collections 的區別#
- Collection 是集合的上級接口,繼承它的有 Set 和 List 接口
- Collections 是集合的工具類,提供了一系列的靜態方法對集合的搜索、查找、同步等操作
六、Enumeration 和 Iterator 接口的區別#
Iterator 替代了 Enumeration,Enumeration 是一個舊的迭代器了
- Iterator 有 fail-fast 機制,比 Enumeration 更安全
- Iterator 能夠刪除元素,Enumeration 並不能刪除元素
七、ListIterator 有什麼特點#
- ListIterator 繼承了 Iterator 接口,它用於遍歷 List 集合的元素。
- ListIterator 可以實現雙向遍歷,添加元素,設置元素
八、Java 集合的 fail-fast 快速失敗機制#
fail-fast 機制是 java 容器(Collection 和 Map 都存在 fail-fast 機制)中的一種錯誤機制。在遍歷一個容器對象時,當容器結構被修改,很有可能會拋出ConcurrentModificationException
,產生 fail-fast
什麼情況會出現 fail-fast#
- 單線程環境:遍歷一個集合過程中,集合結構被修改。注意,listIterator.remove () 方法修改集合結構不會拋出這個異常。
- 多線程環境:當一個線程遍歷集合過程中,而另一個線程對集合結構進行了修改
實現原理#
集合內部維護了一個 modCount
變量,當遍歷集合節點的時候會判斷modCount
和expectedModCount
是否相等,如果不相等就表示已經有線程修改了集合結構
九、comparable 和 Comparator 的區別#
- comparable 接口實際上是出自 java.lang 包,它有一個 compareTo (Object obj) 方法用來排序
- comparator 接口實際上是出自 java.util 包,它有一個 compare (Object obj1, Object obj2) 方法用來排序