一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 基于java集合中的一些易混淆的知識點(詳解)

基于java集合中的一些易混淆的知識點(詳解)

2020-06-12 14:57jingxian 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(),

?
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++]);
 }
}
而Arrays.sort()中,可以看出是通過ComparableTimSort.sort(Object[] a)實現的:
?
1
2
3
4
5
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中用于大小比較部分為:
?
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集合中的一些易混淆的知識點(詳解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品综合一二三区在线 | 欧美成人精品第一区二区三区 | 91制片厂制作果冻传媒123 | 校园春色偷拍自拍 | 国产精品视频在这里有精品 | 日产精品一二三四区国产 | 荷兰精品女人性hd | 国产亚洲精品91 | 国产自在自拍 | 色狠狠色狠狠综合天天 | 亚洲精品一区波多野结衣 | 午夜亚洲WWW湿好大 午夜想想爱 | 亚洲精品动漫免费二区 | 亚洲天堂色视频 | 歪歪私人影院成人毛片 | 日本老妇人乱视频 | 亚洲AV 日韩 国产 有码 | 秋霞一级成人欧美理论 | 99热这里只有精品免费 | 亚洲+欧美+国产+综合 | 公翁的舌尖研磨她的花蒂小说 | 九色PORNY丨视频入口 | 国产精品模特hd在线 | 久久人妻熟女中文字幕AV蜜芽 | 2020中文字幕 | 欧美一级视 | 成人免费国产欧美日韩你懂的 | 99ri国产在线观看 | 精品国产麻豆免费人成网站 | 强迫高h| 美女福利视频一区二区 | 免费一级片在线 | 成人免费国产欧美日韩你懂的 | 探花 在线 | 国产亚洲精品美女2020久久 | 好紧好爽再叫浪一点点潘金莲 | 亚洲欧美日韩国产综合专区 | 久久日本片精品AAAAA国产 | 韩国久久 | 国产第2页| 第一福利在线观看永久视频 |