單列集合Colleation、List、Set及其子類
單列集合的頂級父類是Colleation接口、它下面又分爲兩派List集合和Set集合,List集合下又有兩個實現類比較常用分別是LinkedList、ArrayList,Set集合下又有三個實現類比較常用分別是HashSet、LinkedHashSet、TreeSet集合。
這篇文章主要來說單列集合、也就是紅色框框標註的。
一:Colleation集合
Collection是所有單列集合的父接口,因此在Collection中定義了單列集合(List和Set)通用的一些方法,這些方法可用於操作所有的單列集合。
注意:Colleation沒有索引的概念
創建方式:創建Colleation對象要new它的實現類才能進行操作
Collection<String> col = new ArrayList<>();
方法如下:
public boolean add(E e) : 把給定的對象添加到當前集合中 。
public void clear() : 清空集合中所有的元素。
public boolean remove(E e) : 把給定的對象在當前集合中刪除。
public boolean contains(Object obj) : 判斷當前集合中是否包含給定的對象。
public boolean isEmpty() : 判斷當前集合是否爲空。
public int size() : 返回集合中元素的個數。
public Object[] toArray() : 把集合中的元素,存儲到數組中
Collection<String> col = new ArrayList<>();
//add(E e) 往集合中添加元素
col.add("JavaEE");
col.add("Oracle");
col.add("MySQL");
col.add("Java");
//因爲集合中重寫了toString方法所以直接輸出集合就可以看到元素
System.out.print(col + " ");
//輸出結果:[JavaEE Oracle MySQL Java]
//remove(E e) 刪除指定元素
col.remove("MySQL");
System.out.print(col + " ");
//輸出結果:[JavaEE Oracle Java]
//contains(Object obj) 判斷當前集合是否包含指定對象 包含返回true不包含返回false
boolean flag = col.contains("Java");
System.out.print(flag);
//輸出結果:true
//isEmpty() 判斷集合是否爲空
boolean flag1 = col.isEmpty();
System.out.print(flag1);
//輸出結果:false
//size() 返回當前集合中的元素
int count = col.size();
System.out.print(count );
//輸出結果:3
//toArray() 把當前集合轉換爲數組
Objeat[] objs = col.toArray();
System.out.print(Arrays.toString(objs) );
//輸出結果:[JavaEE, Oracle, Java]
//clear() 清空集合中所有元素
col.clear();
System.out.print(col);
//輸出結果:[]
二:List集合和Set集合
區別:
List集合是有序可重複的,這裏所說的有序是指存進去的順序和取出來的順序是一致的,有索引。
Set集合是無序不可重複的,無索引。
List集合下面分爲ArrayList和LinkedList他們都具備List有序可重複的特點
ArrayList:底層數據結構是數組、它的特點是查詢快、增刪慢
LinkedList:底層數據結構是雙向鏈表、它的特點是查詢慢、增刪快
使用場景:如果涉及查詢的業務邏輯較多就用ArrayList、如果涉及頻繁的修改首尾的操作就用LinkedList
LinkedList的特有方法:
LinkedList是List的子類,List中的方法LinkedList都是可以使用,這裏就不做詳細介紹,我們只需要瞭解LinkedList的特有方法即可。在開發時,LinkedList集合也可以作爲堆棧,隊列的結構使用
public void addFirst(E e) :將指定元素插入此列表的開頭。
public void addLast(E e) :將指定元素添加到此列表的結尾。
public E getFirst() :返回此列表的第一個元素。
public E getLast() :返回此列表的最後一個元素。
public E removeFirst() :移除並返回此列表的第一個元素。
public E removeLast() :移除並返回此列表的最後一個元素。
public E pop() :從此列表所表示的堆棧處彈出一個元素。
public void push(E e) :將元素推入此列表所表示的堆棧。
public boolean isEmpty() :如果列表不包含元素,則返回true。
Set集合下面分爲HashSet和LinkedHashSet和TreeSet他們都具備Set無序不可重複的特點
HashSet:底層原理是哈希表 jdk1.8以後是 數組+鏈表+紅黑樹
存儲機制:
哈希表存入數據的圖,數組分16個,然後根據hash值(取模)%16往數組裏面存,如果存入的同一地方多於一個,那就建立鏈表墜在下面,鏈表長度大於8,就開始建立紅黑樹進行存儲。
HashSet確保數據唯一性的依據是,先比較hashCode值,如果不一樣就直接存儲,如果一樣就會再次使用equals進行值的比較,如果一樣就捨棄、證明元素重複,如果不一樣就以鏈表形式存儲。
如果要存儲自定義類型,要確保唯一性的話,要重寫hashCode和equals方法。
HashSet 構造函數有加載因子,爲0.75,存儲到達百分之75,自動擴容 2倍
LinkedHashSet:底層原理是 鏈表+哈希表 它繼承了HashSet
特點:存儲是有序的。其他方法都差不多,請參見API
TreeSet:底層原理是 紅黑樹
作用:使用元素的自然排序規則,對集合中的元素進行排序(內容會使用Comparator比較器進行的默認的升序)
構造:
無參:TreeSet():->進行默認的排序
有參:TreeSet(Comparator<? super E> comparator) ->指定排序規則
所有集合子類都具有父類的特點,所以父類具有的特點子類都有,每個不同的子類都有自己的特點,根據不同的場景使用不同的集合。