基於java聚集中的一些易混雜的常識點(詳解)。本站提示廣大學習愛好者:(基於java聚集中的一些易混雜的常識點(詳解))文章只能為提供參考,不一定能成為您想要的結果。以下是基於java聚集中的一些易混雜的常識點(詳解)正文
(一) 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(),
@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++]); } }而Arrays.sort()中,可以看出是經由過程ComparableTimSort.sort(Object[] a)完成的:
public static void sort(Object[] array) { // BEGIN android-changed ComparableTimSort.sort(array); // END android-changed }static void sort(Object[] a)到static void sort(Object[] a, int lo, int hi)到private static void binarySort(Object[] a, int lo, int hi, int start)。在binarySort頂用於年夜小比擬部門為:
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聚集中的一些易混雜的常識點(詳解)就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。