基于java集合中的一些易混淆的知識點(diǎn)(詳解)
(一) collection和collections
這兩者均位于java.util包下,不同的是:
collection是一個集合接口,有ListSet等常見的子接口,是集合框架圖的第一個節(jié)點(diǎn),,提供了對集合對象進(jìn)行基本操作的一系列方法。
常見的方法有:
boolean add(E e) 往容器中添加元素;int size() 返回collection的元素數(shù);boolean isEmpty() 判斷此容器是否為空; boolean contains(Object o) 如果此collection包含指定的元素,則返回true,,這里會用到equals()方法;boolean remove(Object o) 移除指定元素的實(shí)例;等。
而collections是一個包裝類,它包含有各種有關(guān)集合操作的靜態(tài)多態(tài)方法,它包含在 collection 上操作的多態(tài)算法,即“包裝器”,包裝器返回由指定 collection 支持的新 collection,以及少數(shù)其他內(nèi)容。
常見的方法有:
void sort(List) 對List的內(nèi)容進(jìn)行排序。
這里要注意的是,(ps:以下有關(guān)sort()的說明摘自淺談對象數(shù)組或list排序及Collections排序原理,對List及Collection排序追本溯源,寫得很清晰)
這個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接口的唯一一個方法:compareTo(),所有如果自定義的類裝載到容器中需要進(jìn)行比較的時候,要實(shí)現(xiàn)Comparable接口或繼承Comparator類,并重寫compareTo()方法。
int binarySearch(List object) 對于順序的List容器,采用折半查找法查找指定對象;void reverse(List) 對List的容器內(nèi)的對象進(jìn)行逆序排列;等。
(二)Iterator和Iterable
首先,Iterable位于java.lang包下,Iterator位于java.util包下。在集合框架中,Iterator接口中定義了一下三個方法:boolean hasNext();E next();void remove()。而Iterable中只定義了一個方法:iterator(),返回值為實(shí)現(xiàn)了Iterator接口的的一個對象。Collection繼承了Iterable這個超級接口,故所有的集合框架中的實(shí)現(xiàn)類都具有iterator()這個方法,而多態(tài)讓Iterator的引用可以訪問到當(dāng)前集合中實(shí)現(xiàn)了Iterator的那部分(即那三個方法)。此時如果需要刪除元素,由于Iterator對這個集合操作時完成了鎖定,在用Iterator循環(huán)遍歷的過程中只能使用Iterator的remove()方法,而不能使用Collection自己的remove(Object)方法。
那么為什么一定要實(shí)現(xiàn)Iterable接口,為什么不直接實(shí)現(xiàn)Iterator接口呢,這樣就可以讓集合類直接繼承這三個方法?
看一下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接口,勢必導(dǎo)致集合對象中包含當(dāng)前迭代位置的數(shù)據(jù)(指針)。
當(dāng)集合在不同方法間被傳遞時,由于當(dāng)前迭代位置不可預(yù)置,那么next()方法的結(jié)果會變成不可預(yù)知。
除非再為Iterator接口添加一個reset()方法,用來重置當(dāng)前迭代位置。
但即時這樣,Collection也只能同時存在一個當(dāng)前迭代位置。
而Iterable則不然,每次調(diào)用都會返回一個從頭開始計數(shù)的迭代器。
多個迭代器是互不干擾的。
以上這篇基于java集合中的一些易混淆的知識點(diǎn)(詳解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring AOP結(jié)合注解實(shí)現(xiàn)接口層操作日志記錄
在項(xiàng)目開發(fā)中我們需要記錄接口的操作日志:包含請求參數(shù)、響應(yīng)參數(shù)、接口所屬模塊、接口功能描述、請求地址、ip地址等信息;實(shí)現(xiàn)思路很簡單就是基于注解和aop的方式去記錄日志,主要的難點(diǎn)在于日志表結(jié)構(gòu)、注解的設(shè)計已經(jīng)aop實(shí)現(xiàn)的一些比較好的實(shí)現(xiàn)方式的借鑒2022-08-08Java synchronized底層的實(shí)現(xiàn)原理
這篇文章主要介紹了Java synchronized底層的實(shí)現(xiàn)原理,文章基于Java來介紹 synchronized 是如何運(yùn)行的,內(nèi)容詳細(xì)具有一定的參考價值,需要的小伙伴可以參考一下2022-05-05SpringMVC中參數(shù)綁定問題實(shí)例詳解
springmvc是用來處理頁面的一些請求,然后將數(shù)據(jù)再通過視圖返回給用戶的,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中參數(shù)綁定問題的相關(guān)資料,需要的朋友可以參考下2022-04-04兩種Spring服務(wù)關(guān)閉時對象銷毀的實(shí)現(xiàn)方法
spring提供了兩種方式用于實(shí)現(xiàn)對象銷毀時去執(zhí)行的操作,本文主要為大家詳細(xì)介紹了這兩種方式的具體實(shí)現(xiàn),文中的示例代碼講解詳細(xì),希望對大家有所幫助2023-04-04springboot項(xiàng)目打成war包部署到tomcat遇到的一些問題
這篇文章主要介紹了springboot項(xiàng)目打成war包部署到tomcat遇到的一些問題,需要的朋友可以參考下2017-06-06java設(shè)計模式Ctrl?C和Ctrl?V的原型模式詳解
這篇文章主要為大家介紹了java設(shè)計模式Ctrl?C和Ctrl?V的原型模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02