欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年09月07日 11:11:48   投稿:jingxian  
下面小編就為大家?guī)硪黄趈ava集合中的一些易混淆的知識點(diǎn)(詳解)。小編覺得挺不錯的,現(xià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++]); 
 } 
} 
而Arrays.sort()中,可以看出是通過ComparableTimSort.sort(Object[] a)實(shí)現(xiàn)的:
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(),所有如果自定義的類裝載到容器中需要進(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)接口層操作日志記錄

    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-08
  • 基于Hadoop實(shí)現(xiàn)Knn算法

    基于Hadoop實(shí)現(xiàn)Knn算法

    這篇文章主要為大家詳細(xì) 介紹了基于Hadoop實(shí)現(xiàn)Knn算法的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Java?String之contains方法的使用詳解

    Java?String之contains方法的使用詳解

    這篇文章主要介紹了Java?String之contains方法的使用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java synchronized底層的實(shí)現(xiàn)原理

    Java synchronized底層的實(shí)現(xiàn)原理

    這篇文章主要介紹了Java synchronized底層的實(shí)現(xiàn)原理,文章基于Java來介紹 synchronized 是如何運(yùn)行的,內(nèi)容詳細(xì)具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • 整理很詳細(xì)的Java正則表達(dá)式使用大全

    整理很詳細(xì)的Java正則表達(dá)式使用大全

    這篇文章為大家整理了很詳細(xì)的Java正則表達(dá)式使用大全,大家在使用Java正則表達(dá)式的時候可查閱這篇文章,認(rèn)為不錯的朋友可以收藏起來
    2015-12-12
  • SpringMVC中參數(shù)綁定問題實(shí)例詳解

    SpringMVC中參數(shù)綁定問題實(shí)例詳解

    springmvc是用來處理頁面的一些請求,然后將數(shù)據(jù)再通過視圖返回給用戶的,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中參數(shù)綁定問題的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • 兩種Spring服務(wù)關(guān)閉時對象銷毀的實(shí)現(xiàn)方法

    兩種Spring服務(wù)關(guān)閉時對象銷毀的實(shí)現(xiàn)方法

    spring提供了兩種方式用于實(shí)現(xiàn)對象銷毀時去執(zhí)行的操作,本文主要為大家詳細(xì)介紹了這兩種方式的具體實(shí)現(xiàn),文中的示例代碼講解詳細(xì),希望對大家有所幫助
    2023-04-04
  • springboot項(xiàng)目打成war包部署到tomcat遇到的一些問題

    springboot項(xiàng)目打成war包部署到tomcat遇到的一些問題

    這篇文章主要介紹了springboot項(xiàng)目打成war包部署到tomcat遇到的一些問題,需要的朋友可以參考下
    2017-06-06
  • java設(shè)計模式Ctrl?C和Ctrl?V的原型模式詳解

    java設(shè)計模式Ctrl?C和Ctrl?V的原型模式詳解

    這篇文章主要為大家介紹了java設(shè)計模式Ctrl?C和Ctrl?V的原型模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Kotlin 基礎(chǔ)語法詳細(xì)介紹

    Kotlin 基礎(chǔ)語法詳細(xì)介紹

    這篇文章主要介紹了Kotlin 基礎(chǔ)語法詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評論