集合概述
javva集合大致可以分為Set、List、Queue、Map,四種體系。其中,Set代表無序、不可重復的集合;List代表有序、重復的集合;Map代表具有映射關(guān)系的集合;java5增加的Queue代表一種隊列集合實現(xiàn)。所有的集合類都位于java.util包下。

單列集合
java.util.Collection是單列集合的頂層父接口,它有2個常用的子接口:List和Set.
List集合中的元素有序,并且可以重復,元素有索引;Set集合中的元素無序,并且不可以重復(唯一),元素無索引。
-
Collection集合中的常用方法:
- public boolean add(E e):把給定的對象添加到當前集合中
- public void clear():清空集合中所有的元素
- public boolean remove(E e):把給定的對象在當前集合中刪除
- public boolean contains(Object obj):判斷當前集合中是否包含給定的對象
- public boolean isEmpty():判斷當前集合是否為空
- public int size():返回集合中元素的個數(shù)
- public Object[] toArray():把集合中的元素,存儲到數(shù)組中
-
List集合除了有Collection中的常用方法外,還有以下常用方法:
- public void add(int index, E element):將將指定的元素,添加到該集合中的指定位置上
- public E get(int index):返回集合中指定位置的元素
- public E remove(int index):移出列表中指定位置的元素,返回的是被移除的元素
- public E set(int index, E element):用指定元素替換集合中指定位置的元素,返回值是更新前的元素。
-
LinkedList類除了擁有List接口中的方法,還有以下方法:
- public void addFirst(E e):將指定元素插入此列表的開頭
- public void addLast(E e):將指定元素添加到此列表的結(jié)尾
- public E getFirst():返回此列表的第一個元素
- public E getLast():返回此列表的最后一個元素
- public E removeFirst():移除并返回此列表的第一個元素
- public E removeLast():移除并返回此列表的最后一個元素
- public E pop():從此列表所表示的堆棧處彈出一個元素。就是removeFirst()
- public void push(E e):將元素推入此列表所表示的堆棧。就是addFirst()
Set集合,特點:元素無索引,元素不能重復,無序。常用的實現(xiàn)類有HashSet、LinkedHashSet(繼承了HashSet)、TreeSet。
-
HashSet
- 特點是:不能保證元素的排列順序,順序可能與添加順序不同;HashSet不是同步的;集合元素值可以為null.
- 存儲數(shù)據(jù)的結(jié)構(gòu)是哈希表結(jié)構(gòu),在jdk8以前是數(shù)組+鏈表;在jdk8以后:當鏈表元素個數(shù)沒有超過8個就是數(shù)組+鏈表,鏈表元素個數(shù)超過8個就是數(shù)組+鏈表+紅黑樹
-
保證元素唯一的原理:主要依賴元素的hashCode()和equals()方法:
- 當集合存儲某個元素,就會調(diào)用該元素的hashCode()方法計算該元素的哈希值;
- 判斷該哈希值對應(yīng)的位置上,是否有相同哈希值的元素;
- 如果該位置上沒有相同哈希值的元素,那么久直接存儲
- 如果該位置上有相同哈希值的元素,那么就產(chǎn)生了哈希沖突
- 如果產(chǎn)生了哈希沖突,就會調(diào)用該元素的equals()方法與該位置上所有的元素一一進行比較:如果比較完成后,該位置上任意一個元素與該元素相等,那么就不存儲;如果比較完成后,該位置上沒有一個元素與該元素相等,那么就存儲
LinkedHashSet:繼承了HashSet,所以也是根據(jù)元素的hashCode值來決定元素的存儲位置,但它同事使用鏈表來維護元素的次序,這樣使得元素看起來是以插入順序保存的。是鏈表和哈希表組合的一個數(shù)據(jù)結(jié)構(gòu),依然不允許集合元素重復。
-
TreeSet:是Set接口的一個實現(xiàn)類,底層依賴于TreeMap,是一種基于紅黑樹的實現(xiàn)。
- 特點是元素唯一,元素沒有索引,集合元素處于排序狀態(tài)。使用元素的自然順序?qū)υ剡M行排序(要求集合元素所屬的類必須實現(xiàn)Comparable接口,重寫compareTo方法,在其中書寫排序規(guī)則),或者根據(jù)創(chuàng)建TreeSet時提供的Comparator比較器進行排序,具體取決于使用的構(gòu)造方法??諈?gòu)造就是自然排序。有參構(gòu)造,參數(shù)就是比較器,是按比較器排序。
雙列集合

Map<K, V> 接口:也稱Map集合,是所有雙列集合的頂層父接口。K用來限制鍵的類型,V用來限制值的類型。
-
Map集合特點:
- Map集合存儲元素是以鍵值對的形式存儲,也就是說每一個鍵值對都有鍵和值
- 通過鍵取值
- Map集合中的鍵不能重復,如果鍵重復了,那么值就會覆蓋
- Map集合中的值是可以重復的
Map接口中常用方法:
- public V put(K key, V value):把指定的鍵與指定的值添加到Map集合中,返回被替換的值,如果沒有就返回null
- public V remove(Object key):把指定的鍵 所對應(yīng)的鍵值對元素在Map集合中刪除,返回被刪除的元素的值
- public V get(Object key):根據(jù)指定的鍵,在Map集合中獲取對應(yīng)的值,沒有就返回null
- public boolean containsKey(Object key):判斷該集合中是否有此鍵
- public boolean containsValue(Object value):判斷該集合中是否有此值
- public int size():獲取集合中鍵值對的個數(shù)
- public Set<K> keySet():獲取Map集合中所有的鍵,存儲到Set集合中
- public Collection<V> values():獲取Map集合中所有的值,存儲到Collection集合中
- public Set<Map.Entry<K, V>> entrySet():獲取到Map集合中所有的 鍵值對對象 的集合(Set集合)。Entry<K, V>表示鍵值對對象類型。由于Entry<K, V>是Map接口的內(nèi)部接口,所以在外部使用的時候需要寫成Map.Entry<K, V> 。 (外部要方位成員內(nèi)部類:外部類.內(nèi)部類)。Entry中的常用方法:1、K getKey():獲取鍵值對對象包裝的鍵;2、V getValue():獲取鍵值對對象包裝的值
Map的遍歷:方式1、鍵找值;方式2、鍵值對方式
方式1:鍵找值方式
1. 獲取map集合中所有的鍵,keySet()方法
2. 遍歷獲取到的所有鍵
3. 根據(jù)鍵找值
方式2:根據(jù)鍵值對對象的方式
1. 獲取所有鍵值對對應(yīng)的所有鍵值對對象
2. 循環(huán)遍歷所有鍵值對對象
3. 使用鍵值對對象獲取鍵和值,getKey()和getValue()
HashMap集合,根據(jù)hashCode和equals方法保證鍵唯一,類似于單列集合中的HashSet。
TreeMap集合,鍵唯一,可以對鍵值對進行排序。構(gòu)造方法TreeMap()是按照默認規(guī)則對鍵記性排序,要求鍵所屬的類實現(xiàn)Comparable接口,重寫compareTo方法,在該方法中書寫默認排序規(guī)則。構(gòu)造方法TreeMap(Comparator<? super K> comparator)是按照指定規(guī)則對鍵進行排序。類似于單列集合中的TreeSet。