日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java源碼解析之接口List

瀏覽:160日期:2022-08-12 13:44:03
目錄前言一、List特有的方法二、超級(jí)實(shí)現(xiàn)類(lèi)AbstractList三、SubList、equals和hascode前言

List接口是Collection接口的三大接口之一,其中的數(shù)據(jù)可以通過(guò)位置檢索,用戶(hù)可以在指定位置插入數(shù)據(jù)。List的數(shù)據(jù)可以為空,可以重復(fù)。我們來(lái)看看api文檔是怎么說(shuō)的:

Java源碼解析之接口List

一、List特有的方法

我們這里就只關(guān)注和Collection不同的方法,主要有以下這些:

//在指定位置,將指定的集合插入到當(dāng)前的集合中boolean addAll(int index, Collection<? extends E> c);//這是一個(gè)默認(rèn)實(shí)現(xiàn)的方法,會(huì)通過(guò)Iterator的方式對(duì)每個(gè)元素進(jìn)行指定的操作default void replaceAll(UnaryOperator<E> operator) { Objects.requireNonNull(operator); final ListIterator<E> li = this.listIterator(); while (li.hasNext()) {li.set(operator.apply(li.next())); }}//排序,依據(jù)指定的規(guī)則對(duì)當(dāng)前集合進(jìn)行排序,可以看到,排序是通過(guò)Arrays這個(gè)工具類(lèi)完成的。default void sort(Comparator<? super E> c) { Object[] a = this.toArray(); Arrays.sort(a, (Comparator) c); ListIterator<E> i = this.listIterator(); for (Object e : a) {i.next();i.set((E) e); }}//獲取指定位置的元素E get(int index);//修改指定位置元素的值E set(int index, E element);//將指定元素添加到指定的位置void add(int index, E element);//將指定位置的元素移除E remove(int index);//返回一個(gè)元素在集合中首次出現(xiàn)的位置int indexOf(Object o);//返回一個(gè)元素在集合中最后一次出現(xiàn)的位置int lastIndexOf(Object o);//ListIterator繼承于Iterator,主要增加了向前遍歷的功能ListIterator<E> listIterator();//從指定位置開(kāi)始,返回一個(gè)ListIteratorListIterator<E> listIterator(int index);//返回一個(gè)子集合[fromIndex, toIndex),非結(jié)構(gòu)性的修改返回值會(huì)反映到原表,反之亦然。//如果原表進(jìn)行了結(jié)構(gòu)修改,則返回的子列表可能發(fā)生不可預(yù)料的事情L(zhǎng)ist<E> subList(int fromIndex, int toIndex);

通過(guò)對(duì)上面方法的研究,我們不難發(fā)現(xiàn),collection接口主要提供一些通常的方法,而List接口則針對(duì)線性表的結(jié)構(gòu),提供了對(duì)位置以及字表的操作。

二、超級(jí)實(shí)現(xiàn)類(lèi)AbstractList

我們先看看源文檔是怎么來(lái)說(shuō)AbstractList的,要實(shí)現(xiàn)一個(gè)不可修改的集合,只需要復(fù)寫(xiě)get和size方法。如果要實(shí)現(xiàn)一個(gè)可以修改的集合,還需要復(fù)寫(xiě)set方法,如果要?jiǎng)討B(tài)調(diào)整大小,就必須實(shí)現(xiàn)add和remove方法。

接下里我們一起來(lái)來(lái)看看源碼吧!

//在AbstractCollection中,add方法默認(rèn)會(huì)拋出異常,//而在這里是調(diào)用了add(int index, E e)方法,但這個(gè)方法也是沒(méi)有實(shí)現(xiàn)的。//這里默認(rèn)會(huì)把元素添加到末尾。public boolean add(E e) { add(size(), e); return true;}//同上,這個(gè)只需要進(jìn)行一次遍歷即可public boolean addAll(int index, Collection<? extends E> c) { //... }

接下里我們?cè)诶^續(xù)看看其他幾個(gè)方法,這幾個(gè)是與Iterator和ListIterator息息相關(guān)的,在AbstractList中有具體的實(shí)現(xiàn),我們先來(lái)看看它是如何把集合轉(zhuǎn)變成Iterator對(duì)象并支持foreach循環(huán)的吧。

我們通過(guò)源碼發(fā)現(xiàn):在Iterator方法中,是直接返回一個(gè) Itr對(duì)象

public Iterator<E> iterator() { return new Itr();}

其實(shí)我們很快也就會(huì)明白,它是實(shí)現(xiàn)了一個(gè)內(nèi)部類(lèi),這個(gè)內(nèi)部類(lèi)實(shí)現(xiàn)了Iterator接口,合理的處理hasNext、next、remove方法。這個(gè)源碼就不粘貼啦,其中僅僅在remove時(shí)考慮了一下多線程問(wèn)題,有興趣的可以自己去看看。

我們來(lái)看看另一個(gè)吧?ListIterator吧他也是通過(guò)一個(gè)內(nèi)部類(lèi)是實(shí)現(xiàn)的

public ListIterator<E> listIterator() { return listIterator(0);}

public ListIterator<E> listIterator(final int index) { rangeCheckForAdd(index); return new ListItr(index);}

事實(shí)證明,和我們想的一樣,AbstractList內(nèi)部還定義了一個(gè)ListItr,實(shí)現(xiàn)了ListIterator接口,其實(shí)現(xiàn)也很簡(jiǎn)單,就不粘貼源碼啦。

接下倆讓我們來(lái)看看AbtractList是怎么利用這兩個(gè)類(lèi)來(lái)做事情的

//尋找一個(gè)元素首次出現(xiàn)的位置,只需要從前往后遍歷,找到那個(gè)元素并返回其位置即可。public int indexOf(Object o) { ListIterator<E> it = listIterator(); if (o==null) {while (it.hasNext()) if (it.next()==null)return it.previousIndex(); } else {while (it.hasNext()) if (o.equals(it.next()))return it.previousIndex(); } return -1;}//同理,尋找一個(gè)元素最后一次出現(xiàn)的位置,只需要從列表最后一位向前遍歷即可。//看到listIterator(int index)方法是可以傳遞參數(shù)的,這個(gè)我想我們都可以照著寫(xiě)出來(lái)了。public int lastIndexOf(Object o) { //...}//這個(gè)方法是把從fromIndex到toIndex之間的元素從集合中刪除。//clear()方法也是調(diào)用這個(gè)實(shí)現(xiàn)的(我認(rèn)為clear實(shí)現(xiàn)意義并不大,因?yàn)樵谄渖霞?jí)AbstractCollection中已經(jīng)有了具體實(shí)現(xiàn))。protected void removeRange(int fromIndex, int toIndex) { ListIterator<E> it = listIterator(fromIndex); for (int i=0, n=toIndex-fromIndex; i<n; i++) {it.next();it.remove(); }}

在接下來(lái)讓我們來(lái)說(shuō)一說(shuō)兩個(gè)比較重要的內(nèi)容一個(gè)是關(guān)于SubList,另一個(gè)是關(guān)于equals和hascode的。

三、SubList、equals和hascode

SubList并不是新建了一個(gè)list,只是持有當(dāng)前集合的引用,然后控制了用戶(hù)可以操作的范圍,所以在接口定義時(shí)就說(shuō)明了其更改會(huì)直接反應(yīng)到原集合中。SubList是定AbstractList內(nèi)部,并且是AbstractList的基礎(chǔ)上增加了對(duì)可選范圍的控制。

而equals和hascode的實(shí)現(xiàn),也關(guān)乎我們的使用。在AbstractList中,這兩個(gè)方法不僅與其實(shí)例有關(guān),也和其內(nèi)部包含的元素有關(guān),所以在定義數(shù)據(jù)元素時(shí),也應(yīng)該復(fù)寫(xiě)這兩個(gè)方法,以保證程序的正確運(yùn)行。這里看下其源碼加深一下印象吧。

public boolean equals(Object o) { if (o == this)return true; if (!(o instanceof List))return false; ListIterator<E> e1 = listIterator(); ListIterator<?> e2 = ((List<?>) o).listIterator(); while (e1.hasNext() && e2.hasNext()) {E o1 = e1.next();Object o2 = e2.next();//這里用到了數(shù)據(jù)元素的equals方法if (!(o1==null ? o2==null : o1.equals(o2))) return false; } return !(e1.hasNext() || e2.hasNext());}

public int hashCode() { int hashCode = 1; for (E e : this)//這里用到了數(shù)據(jù)元素的hashCode方法hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); return hashCode;}

到此這篇關(guān)于Java源碼解析之接口List的文章就介紹到這了,更多相關(guān)Java接口List內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
麻豆成全视频免费观看在线看| 亚洲一区亚洲| 亚洲www啪成人一区二区| 中文字幕一区二区三区日韩精品| 精品视频网站| 国产精品一区毛片| 99亚洲精品| 美女少妇全过程你懂的久久| 麻豆久久久久久久| 国产在线观看91一区二区三区| 国产欧美另类| 国产毛片精品久久| 奇米色欧美一区二区三区| 丝袜美腿成人在线| 日韩在线播放一区二区| 亚洲精品123区| 老牛国产精品一区的观看方式| 亚洲男女av一区二区| 久久精品影视| 国产亚洲永久域名| 综合国产在线| 亚洲影视一区| 欧美在线精品一区| 青青草伊人久久| 国产精品亚洲欧美日韩一区在线 | 久久www成人_看片免费不卡| 99在线观看免费视频精品观看| 成人三级高清视频在线看| 国产精品nxnn| 精品国产欧美日韩| 久久婷婷激情| 日韩精品a在线观看91| 久久久蜜桃一区二区人| 国产精品毛片久久久| 亚洲欧美久久| 国产福利91精品一区二区| 亚洲久久一区| 亚洲欧洲日本mm| 日韩精品永久网址| 麻豆久久一区二区| 欧美日韩亚洲国产精品| 在线看片日韩| 一区二区亚洲精品| 国产99久久久国产精品成人免费| 国产精品多人| 日韩精品一区二区三区av| 久久婷婷一区| 久久蜜桃资源一区二区老牛| 久久99蜜桃| 久久黄色影视| 日韩二区在线观看| 蜜臀av国产精品久久久久 | 福利一区二区三区视频在线观看| 日本不卡在线视频| 日韩精品高清不卡| 日韩在线观看中文字幕| 日韩在线a电影| 亚洲经典在线| 欧洲在线一区| 成人午夜国产| 成人免费网站www网站高清| 亚洲综合电影| 午夜av成人| 一区免费视频| 一区二区国产精品| 亚洲精品乱码久久久久久蜜桃麻豆| 伊人久久大香线蕉av超碰演员| 女人天堂亚洲aⅴ在线观看| 欧美精品一区二区久久| 亚洲国产日韩欧美在线| 国内亚洲精品| 最新日韩欧美| 欧美日韩1区| 国产精品.xx视频.xxtv| 久久天堂影院| 日韩精品网站| 麻豆精品网站| 国产丝袜一区| 在线手机中文字幕| 久久亚洲成人| 日韩综合小视频| 精品国产一区二区三区性色av| 色欧美自拍视频| 蜜臀av免费一区二区三区| 香蕉久久国产| 日韩av影院| 免费久久久久久久久| 日本在线视频一区二区| 国产乱码精品一区二区三区四区| 国产精品22p| 蜜臀91精品国产高清在线观看| 综合一区av| 日韩欧美看国产| 日韩高清电影一区| 91日韩免费| 日韩av一二三| 99久久九九| 国产精品毛片视频| 亚洲欧洲另类| 国产成人精选| 日本va欧美va欧美va精品| 激情久久久久久久| 你懂的亚洲视频| 清纯唯美亚洲综合一区| 日韩精品网站| 久久精品国产网站| 亚洲精品极品| 999国产精品| 国产精品久久久久久久久久妞妞| 亚洲激情五月| 中文在线а√在线8| 国产精品久久久久久模特| 91成人精品视频| 精品国产乱码久久久久久樱花| 石原莉奈在线亚洲二区| 国产精品视频首页| 亚洲精品日韩久久| 手机精品视频在线观看| 在线看片福利| 精品免费视频| 久久中文字幕一区二区三区| 欧美一级二区| 日韩1区2区日韩1区2区| 只有精品亚洲| 亚洲日本国产| 日本成人手机在线| 欧美亚洲网站| 国产精品videossex| 日韩一区二区三区在线看| 免费人成网站在线观看欧美高清| 欧美日韩视频一区二区三区| 欧美69视频| 神马午夜在线视频| 日韩av专区| 青青久久av| 三级在线观看一区二区| 日韩激情一区二区| 国产精品xxx在线观看| 成人在线免费观看网站| 日本欧美国产| 女人天堂亚洲aⅴ在线观看| 中文久久精品| 日本aⅴ精品一区二区三区| 国产欧美精品| 另类中文字幕国产精品| 中文一区在线| 国产精品v日韩精品v欧美精品网站| 久久av免费| 视频二区不卡| 香蕉成人久久| 久久精品女人| 欧美日韩国产一区精品一区| 日本色综合中文字幕| 精品日产乱码久久久久久仙踪林| 91精品xxx在线观看| 亚洲免费中文| 免费一区二区三区在线视频| 国内亚洲精品| 国产乱人伦精品一区| 日韩av首页| 国产精品s色| 玖玖玖国产精品| 日韩福利一区| 国产欧美一区二区三区国产幕精品| 国产精品成人自拍| 99视频一区| 日本午夜大片a在线观看| 热久久久久久久| 88xx成人免费观看视频库| 日韩精品视频网| 狠狠久久婷婷| 日韩欧美少妇| 美女精品久久| 久久精品av麻豆的观看方式| 99国产精品| 成人羞羞视频播放网站| 精品一区二区三区中文字幕在线| 蜜桃久久精品一区二区| 91精品99| 国产一区二区三区黄网站| 热久久久久久| 91嫩草精品| 国产日韩欧美一区| 国产精品主播| 久久精品一区二区国产| 国产精品一区二区精品 | 黄色欧美日韩| 日韩视频中文| 国产午夜精品一区二区三区欧美 | 欧美日韩精品一区二区三区在线观看| 国产精品久久久久久久久久10秀| 日韩精品成人在线观看| 久久精品不卡| 吉吉日韩欧美| 成人精品动漫一区二区三区| 国产亚洲欧美日韩在线观看一区二区 | 久久午夜影视| 欧美日韩精品免费观看视频完整| 精品国产91| 久久av免费看|