程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 基於java聚集中的一些易混雜的常識點(詳解)

基於java聚集中的一些易混雜的常識點(詳解)

編輯:關於JAVA

基於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聚集中的一些易混雜的常識點(詳解)就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved