(一) collection和collections
這兩者均位于java.util包下,不同的是:
collection是一個集合接口,有ListSet等常見的子接口,是集合框架圖的第一個節點,,提供了對集合對象進行基本操作的一系列方法。
常見的方法有:
boolean add(E e) 往容器中添加元素;int size() 返回collection的元素數;boolean isEmpty() 判斷此容器是否為空; boolean contains(Object o) 如果此collection包含指定的元素,則返回true,,這里會用到equals()方法;boolean remove(Object o) 移除指定元素的實例;等。
而collections是一個包裝類,它包含有各種有關集合操作的靜態多態方法,它包含在 collection 上操作的多態算法,即“包裝器”,包裝器返回由指定 collection 支持的新 collection,以及少數其他內容。
常見的方法有:
void sort(List) 對List的內容進行排序。
這里要注意的是,(ps:以下有關sort()的說明摘自淺談對象數組或list排序及Collections排序原理,對List及Collection排序追本溯源,寫得很清晰)
這個sort()函數中的排序主體是Arrays.sort(),
1
2
3
4
5
6
7
8
9
10
11
|
@SuppressWarnings ( "unchecked" ) public static <T extends Comparable<? super T>> void sort(List<T> list) { Object[] array = list.toArray(); Arrays.sort(array); int i = 0 ; ListIterator<T> it = list.listIterator(); while (it.hasNext()) { it.next(); it.set((T) array[i++]); } } |
1
2
3
4
5
|
public static void sort(Object[] array) { // BEGIN android-changed ComparableTimSort.sort(array); // END android-changed } |
1
2
3
4
5
6
7
8
9
10
11
12
|
Comparable<Object> pivot = (Comparable) a[start]; int left = lo; int right = start; assert left <= right; while (left < right) { int mid = (left + right) >>> 1 ; if (pivot.compareTo(a[mid]) < 0 ) right = mid; else left = mid + 1 ; } |
二分查找中比較大小部分使用了Comparable接口的唯一一個方法:compareTo(),所有如果自定義的類裝載到容器中需要進行比較的時候,要實現Comparable接口或繼承Comparator類,并重寫compareTo()方法。
int binarySearch(List object) 對于順序的List容器,采用折半查找法查找指定對象;void reverse(List) 對List的容器內的對象進行逆序排列;等。
(二)Iterator和Iterable
首先,Iterable位于java.lang包下,Iterator位于java.util包下。在集合框架中,Iterator接口中定義了一下三個方法:boolean hasNext();E next();void remove()。而Iterable中只定義了一個方法:iterator(),返回值為實現了Iterator接口的的一個對象。Collection繼承了Iterable這個超級接口,故所有的集合框架中的實現類都具有iterator()這個方法,而多態讓Iterator的引用可以訪問到當前集合中實現了Iterator的那部分(即那三個方法)。此時如果需要刪除元素,由于Iterator對這個集合操作時完成了鎖定,在用Iterator循環遍歷的過程中只能使用Iterator的remove()方法,而不能使用Collection自己的remove(Object)方法。
那么為什么一定要實現Iterable接口,為什么不直接實現Iterator接口呢,這樣就可以讓集合類直接繼承這三個方法?
看一下JDK中的集合類,比如List一族或者Set一族,都是實現了Iterable接口,但并不直接實現Iterator接口。
仔細想一下這么做是有道理的。
因為Iterator接口的核心方法next()或者hasNext() 是依賴于迭代器的當前迭代位置的。
如果Collection直接實現Iterator接口,勢必導致集合對象中包含當前迭代位置的數據(指針)。
當集合在不同方法間被傳遞時,由于當前迭代位置不可預置,那么next()方法的結果會變成不可預知。
除非再為Iterator接口添加一個reset()方法,用來重置當前迭代位置。
但即時這樣,Collection也只能同時存在一個當前迭代位置。
而Iterable則不然,每次調用都會返回一個從頭開始計數的迭代器。
多個迭代器是互不干擾的。
以上這篇基于java集合中的一些易混淆的知識點(詳解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。