Java的類集(Collection)框架使你的程序處理對象組的方法標準化。類集框架被設計用于適應幾個目的荣茫。首先胯盯,這種框架是高性能的。對基本類集(動態(tài)數組计露,鏈接表博脑,樹和散列表)的實現(xiàn)是高效率的憎乙。一般很少需要人工去對這些“數據引擎”編寫代碼(如果有的話)。第二點叉趣,框架必須允許不同類型的類集以相同的方式和高度互操作方式工作泞边。第三點,類集必須是容易擴展和/或修改的疗杉。為了實現(xiàn)這一目標阵谚,類集框架被設計成包含一組標準的接口。對這些接口烟具,提供了幾個標準的實現(xiàn)工具(例如LinkedList梢什,HashSet和TreeSet),通常就是這樣使用的朝聋。如果你愿意的話嗡午,也可以實現(xiàn)你自己的類集。為了方便起見冀痕,創(chuàng)建用于各種特殊目的的實現(xiàn)工具荔睹。一部分工具可以使你自己的類集實現(xiàn)更加容易。最后言蛇,增加了允許將標準數組融合到類集框架中的機制僻他。
Set接口:
集合接口定義了一個集合。它擴展了Collection并說明了不允許復制元素的類集的特性腊尚。因此吨拗,如果試圖將復制元素加到集合中時,add()方法將返回false(不拋異常)婿斥。
HashSet:
對于 HashSet 而言丢胚,它是基于 HashMap 實現(xiàn)的,HashSet 底層采用 HashMap 來保存所有元素受扳,因此 HashSet 的實現(xiàn)比較簡單,它只是封裝了一個 HashMap 對象來存儲所有的集合元素兔跌,所有放入 HashSet 中的集合元素實際上由 HashMap 的 key 來保存勘高,而 HashMap 的 value 則存儲了一個 PRESENT,它是一個靜態(tài)的 Object 對象坟桅。 HashSet 的絕大部分方法都是通過調用 HashMap 的方法來實現(xiàn)的华望,因此 HashSet 和 HashMap 兩個集合在實現(xiàn)本質上是相同的。
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}```
TreeSet:
TreeSet是實現(xiàn)了SortedSet接口仅乓,SortedSet接口定義了幾種方法赖舟,使得對集合的處理更加方便。調用first()方法夸楣,可以獲得集合中的第一個對象宾抓。調用last()方法子漩,可以獲得集合中的最后一個元素。調用subSet()方法石洗,可以獲得排序集合的一個指定了第一個和最后一個對象的子集合幢泼。如果需要得到從集合的第一個元素開始的一個子集合,可以使用headSet()方法讲衫。如果需要獲得集合尾部的一個子集合,可以使用tailSet()方法。
TreeSet支持兩種排序方法:自然排序和定制排序鄙漏。
自然排序:TreeSet調用集合元素的compareTo(Object obj)方法來比較元素之間的大小草冈,然后按照元素升序排列。這就要求對象元素必須實現(xiàn)Comparable接口中的compareTo(Object obj)方法枷畏。在自然排序下别厘,TreeSet判斷兩個對象是否相同的唯一標準:兩個對象通過compareTo(Object o)方法比較是否相等:該方法返回0,則認為相等矿辽,返回1則認為不相等丹允。java的一些常見的類,例如Character袋倔,String雕蔽,Date等已經實現(xiàn)了Comparable接口。
定制排序:在創(chuàng)建TreeSet集合對象時宾娜,需要關聯(lián)一個Comparator對象批狐,并且實現(xiàn)Comparator中的compare(T obj1,T obj 2)。當通過Comparator對象實現(xiàn)TreeSet的定制排序時前塔,也不可以向TreeSet中添加不同類型的對象(public TreeSet(Comparator<? super E> comparator))嚣艇。
public class Text {
public static void main(String[] args) {
TreeSet<String> set = new TreeSet<String>();
set.add("c");
set.add("a");
set.add("ef");
set.add("b");
set.add("e");
set.add("d");
SortedSet<String> subSet1 = set.subSet("b", "e");
System.out.println(subSet1); //[b, c, d]
SortedSet<String> subSet2 = set.headSet("b");
System.out.println(subSet2); //[a]
SortedSet<String> subSet3 = set.tailSet("e");
System.out.println(subSet3); //[e, ef]
}
}```
用Set獲取數據時只能用迭代或者foreach來取值。
List接口
List是有序的Collection华弓,使用此接口能夠精確的控制每個元素插入的位置食零。用戶能夠使用索引(元素在List中的位置,類似于數組下 >標)來訪問List中的元素寂屏,這類似于Java的數組贰谣。
ArrayList:
ArrayList是一個基于數組上的鏈表,它擴展AbstractList并執(zhí)行List接口迁霎。ArrayList支持可隨需要而增長的動態(tài)數組吱抚。在Java中,標準數組是定長的考廉。在數組創(chuàng)建之后秘豹,它們不能被加長或縮短,這也就意味著你必須事先知道數組可以容納多少元素昌粤。但是既绕,你直到運行時才能知道需要多大的數組啄刹。為了解決這個問題,類集框架定義了ArrayList岸更。本質上鸵膏,ArrayList是對象引用的一個變長數組。也就是說怎炊,ArrayList能夠動態(tài)地增加或減小其大小谭企。數組列表以一個原始大小被創(chuàng)建。當超過了它的大小评肆,類集自動增大(當前長度的1.5倍债查,初始化長度為10,這里可以用初始化長度來進行性能優(yōu)化)瓜挽。
當使用ArrayList時盹廷,有時想要獲得一個實際的數組,這個數組包含了列表的內容久橙《碚迹可以通過調用方法toArray()來實現(xiàn)它。(數組轉list:Arrays.asList()返回一個受指定數組支持的固定大小的列表)
public class Text {
public static void main(String[] args) {
String[] array = new String[2];
List<String> list2 = Arrays.asList(array);
array[0] = "test2";
System.out.println(list2);
list2.add("test");
System.out.println(list2);
}
}```
在add時會拋出UnsupportedOperationException淆衷,原因是asList返回的是一個Array的一個內部類而不是真正的ArrayList:
![image.png](http://upload-images.jianshu.io/upload_images/5793795-394940c6e959ab04.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Vector:
同ArrayList一樣是一個基于數組上的鏈表缸榄,但是不同的是Vector是同步的。
LinkedList:
與ArrayList一樣實現(xiàn)List接口祝拯,只是ArrayList是List接口的大小可變數組的實現(xiàn)甚带,LinkedList是List接口鏈表的實現(xiàn)〖淹罚基于鏈表實現(xiàn)的方式使得LinkedList在插入和刪除時更優(yōu)于ArrayList鹰贵,而隨機訪問則比ArrayList遜色些。
LinkedList除了它繼承的方法之外康嘉,LinkedList類本身還定義了一些有用的方法碉输,這些方法主要用于操作和訪問列表。使用addFirst()方法可以在列表頭增加元素亭珍;使用敷钾。使用add()方法的add(int, Object)形式,插入項目到指定的位置块蚌。調用getFirst()方法可以獲得第一個元素。調用getLast()方法可以得到最后一個元素膘格。為了刪除第一個元素峭范,可以使用removeFirst()方法;為了刪除最后一個元素瘪贱,可以調用removeLast()方法纱控。
List 在很多方面跟 Array 數組感覺很相似辆毡,尤其是 ArrayList,那 List 和數組究竟哪個更好呢甜害?
相似之處:
都可以表示一組同類型的對象
都使用下標進行索引
不同之處:
數組可以存任何類型元素
List 不可以存基本數據類型舶掖,必須要包裝
數組容量固定不可改變;List 容量可動態(tài)增長
數組效率高; List 由于要維護額外內容尔店,效率相對低一些