基于java集合中的一些易混淆的知識(shí)點(diǎn)(詳解)
(一) collection和collections
這兩者均位于java.util包下,不同的是:
collection是一個(gè)集合接口,有ListSet等常見的子接口,是集合框架圖的第一個(gè)節(jié)點(diǎn),,提供了對(duì)集合對(duì)象進(jìn)行基本操作的一系列方法。
常見的方法有:
boolean add(E e) 往容器中添加元素;int size() 返回collection的元素?cái)?shù);boolean isEmpty() 判斷此容器是否為空; boolean contains(Object o) 如果此collection包含指定的元素,則返回true,,這里會(huì)用到equals()方法;boolean remove(Object o) 移除指定元素的實(shí)例;等。
而collections是一個(gè)包裝類,它包含有各種有關(guān)集合操作的靜態(tài)多態(tài)方法,它包含在 collection 上操作的多態(tài)算法,即“包裝器”,包裝器返回由指定 collection 支持的新 collection,以及少數(shù)其他內(nèi)容。
常見的方法有:
void sort(List) 對(duì)List的內(nèi)容進(jìn)行排序。
這里要注意的是,(ps:以下有關(guān)sort()的說(shuō)明摘自淺談對(duì)象數(shù)組或list排序及Collections排序原理,對(duì)List及Collection排序追本溯源,寫得很清晰)
這個(gè)sort()函數(shù)中的排序主體是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++]);
}
}
public static void sort(Object[] array) {
// BEGIN android-changed
ComparableTimSort.sort(array);
// END android-changed
}
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接口的唯一一個(gè)方法:compareTo(),所有如果自定義的類裝載到容器中需要進(jìn)行比較的時(shí)候,要實(shí)現(xiàn)Comparable接口或繼承Comparator類,并重寫compareTo()方法。
int binarySearch(List object) 對(duì)于順序的List容器,采用折半查找法查找指定對(duì)象;void reverse(List) 對(duì)List的容器內(nèi)的對(duì)象進(jìn)行逆序排列;等。
(二)Iterator和Iterable
首先,Iterable位于java.lang包下,Iterator位于java.util包下。在集合框架中,Iterator接口中定義了一下三個(gè)方法:boolean hasNext();E next();void remove()。而Iterable中只定義了一個(gè)方法:iterator(),返回值為實(shí)現(xiàn)了Iterator接口的的一個(gè)對(duì)象。Collection繼承了Iterable這個(gè)超級(jí)接口,故所有的集合框架中的實(shí)現(xiàn)類都具有iterator()這個(gè)方法,而多態(tài)讓Iterator的引用可以訪問(wèn)到當(dāng)前集合中實(shí)現(xiàn)了Iterator的那部分(即那三個(gè)方法)。此時(shí)如果需要?jiǎng)h除元素,由于Iterator對(duì)這個(gè)集合操作時(shí)完成了鎖定,在用Iterator循環(huán)遍歷的過(guò)程中只能使用Iterator的remove()方法,而不能使用Collection自己的remove(Object)方法。
那么為什么一定要實(shí)現(xiàn)Iterable接口,為什么不直接實(shí)現(xiàn)Iterator接口呢,這樣就可以讓集合類直接繼承這三個(gè)方法?
看一下JDK中的集合類,比如List一族或者Set一族,都是實(shí)現(xiàn)了Iterable接口,但并不直接實(shí)現(xiàn)Iterator接口。
仔細(xì)想一下這么做是有道理的。
因?yàn)镮terator接口的核心方法next()或者h(yuǎn)asNext() 是依賴于迭代器的當(dāng)前迭代位置的。
如果Collection直接實(shí)現(xiàn)Iterator接口,勢(shì)必導(dǎo)致集合對(duì)象中包含當(dāng)前迭代位置的數(shù)據(jù)(指針)。
當(dāng)集合在不同方法間被傳遞時(shí),由于當(dāng)前迭代位置不可預(yù)置,那么next()方法的結(jié)果會(huì)變成不可預(yù)知。
除非再為Iterator接口添加一個(gè)reset()方法,用來(lái)重置當(dāng)前迭代位置。
但即時(shí)這樣,Collection也只能同時(shí)存在一個(gè)當(dāng)前迭代位置。
而Iterable則不然,每次調(diào)用都會(huì)返回一個(gè)從頭開始計(jì)數(shù)的迭代器。
多個(gè)迭代器是互不干擾的。
以上這篇基于java集合中的一些易混淆的知識(shí)點(diǎn)(詳解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java 動(dòng)態(tài)加載jar和class文件實(shí)例解析
這篇文章主要介紹了Java 動(dòng)態(tài)加載jar和class文件實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
Hadoop使用hdfs指令查看hdfs目錄的根目錄顯示被拒的原因及解決方案
這篇文章主要介紹了Hadoop使用hdfs指令查看hdfs目錄的根目錄顯示被拒的原因及解決方案,分布式部署hadoop,服務(wù)機(jī)只有namenode節(jié)點(diǎn),主機(jī)包含其他所有節(jié)點(diǎn),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
在Mybatis使用Integer與''進(jìn)行比較的坑及解決
這篇文章主要介紹了在Mybatis使用Integer與''進(jìn)行比較的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
使用Netty快速實(shí)現(xiàn)一個(gè)群聊功能的示例詳解
這篇文章主要為大家詳細(xì)介紹了如何利用?Netty?框架開發(fā)一個(gè)?WebSocket?服務(wù)端,從而實(shí)現(xiàn)一個(gè)簡(jiǎn)單的在線聊天功能,感興趣的小伙伴可以了解下2023-11-11
SpringBoot處理全局統(tǒng)一異常的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot處理全局統(tǒng)一異常的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

