集合(List,Set,Map)
目錄
1.13- Iterator 和 ListIterator 的區別
1.1-List
List下有ArrayList,Vector,LinkedList,List是有序的可以重複的
1:ArrayList
- 底層使用的是數組,所以查詢特定的元素特別快,插入刪除慢,線程不安全
- 初始化容量:10
2:Vector
- 底層使用的是數組,線程安全的
- 初始化容量:10
3:LinkedList
- 底層使用的是鏈表,所以插入和刪除特別快,查詢慢
1.2-Set
無序的,不可以重複的,根據equals和hashCode判斷,就是如果一個對象要 存儲在set中,必須重寫equals和hashCode方法
1:HashSet
- 底層是HashMap
- 向HashSet添加元素就是把元素作爲鍵添加到底層的HashMap中
2:TreeSet
- TreeSet實現了SortedSet接口,可以根據元素自然排序,要求集合中的元素必須是可比較的(Comparator與Comparable)
- TreeSet底層是TreeMap
- 向TreeSet添加元素就是把元素作爲鍵添加到底層的TreeMap中
1.3-Map
Map
是按key-value對的形式存儲數據,Map
的key
不允許重複
1:HashMap
- 底層是數組+鏈表,鍵與值都可以爲null,線程不安全
2:CurrentHashMap(jdk1.5後推出的)
3:HashTable
- 底層數組+鏈表,無論key還是value都不能爲null,線程安全,效率低
1.4-HashMap遍歷怎麼遍歷?
兩種方式遍歷:使用EntrySet
遍歷;使用KeySet
遍歷
1.5-HashMap使用場景
比如說讀取參數,在服務之間傳遞一些鍵值對時使用。
下面內容借鑑於:https://blog.csdn.net/qq_41701956/article/details/103253168
1.6- HashMap 還是 TreeMap選擇
對於在Map中插入、刪除和定位元素這類操作,HashMap是最好的選擇。然而,假如你需要對一個有序的key集合進行遍歷,TreeMap是更好的選擇。基於你的collection的大小,也許向HashMap中添加元素會更快,將map換爲TreeMap進行有序key的遍歷。
1.7-HashMap 的實現原理
HashMap概述: HashMap是基於哈希表的Map接口的非同步實現。此實現提供所有可選的映射操作,並允許使用null值和null鍵。此類不保證映射的順序,特別是它不保證該順序恆久不變。
HashMap的數據結構: 在java編程語言中,最基本的結構就是兩種,一個是數組,另外一個是模擬指針(引用),所有的數據結構都可以用這兩個基本結構來構造的,HashMap也不例外。HashMap實際上是一個“鏈表散列”的數據結構,即數組和鏈表的結合體。
當我們往Hashmap中put元素時,首先根據key的hashcode重新計算hash值,根絕hash值得到這個元素在數組中的位置(下標),如果該數組在該位置上已經存放了其他元素,那麼在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放入鏈尾.如果數組中該位置沒有元素,就直接將該元素放到數組的該位置上。
需要注意Jdk 1.8中對HashMap的實現做了優化,當鏈表中的節點數據超過八個之後,該鏈表會轉爲紅黑樹來提高查詢效率,從原來的O(n)到O(logn)
1.8-HashSet 的實現原理
-
HashSet底層由HashMap實現
-
HashSet的值存放於HashMap的key上
-
HashMap的value統一爲PRESENT
1.9-實現數組和 List 之間的轉換
- List轉換成爲數組:調用ArrayList的toArray方法。
- 數組轉換成爲List:調用Arrays的asList方法。
1.10-Array 和 ArrayList 的區別
-
Array可以容納基本類型和對象,而ArrayList只能容納對象。
-
Array是指定大小的,而ArrayList大小是固定的。
-
Array沒有提供ArrayList那麼多功能,比如addAll、removeAll和iterator等。
1.11-迭代器 Iterator
迭代器是一種設計模式,它是一個對象,它可以遍歷並選擇序列中的對象,而開發人員不需要了解該序列的底層結構。迭代器通常被稱爲“輕量級”對象,因爲創建它的代價小。
1.12-Iterator的使用和特點
Java中的Iterator功能比較簡單,並且只能單向移動:
-
(1) 使用方法iterator()要求容器返回一個Iterator。第一次調用Iterator的next()方法時,它返回序列的第一個元素。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。
-
(2) 使用next()獲得序列中的下一個元素。
-
(3) 使用hasNext()檢查序列中是否還有元素。
-
(4) 使用remove()將迭代器新返回的元素刪除。
Iterator是Java迭代器最簡單的實現,爲List設計的ListIterator具有更多的功能,它可以從兩個方向遍歷List,也可以從List中插入和刪除元素。
1.13- Iterator 和 ListIterator 的區別
- Iterator可用來遍歷Set和List集合,但是ListIterator只能用來遍歷List。
- Iterator對集合只能是前向遍歷,ListIterator既可以前向也可以後向。
- ListIterator實現了Iterator接口,幷包含其他的功能,比如:增加元素,替換元素,獲取前一個和後一個元素的索引,等等。