最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

千鋒教育Java入門全套視頻教程(java核心技術(shù),適合java零基礎(chǔ),Java

2023-07-24 09:06 作者:羨江川QL  | 我要投稿

Iterator是迭代器,在代碼中以接口的形式存在,當(dāng)我們使用到迭代器時(shí),首先要考慮為什么迭代器要使用接口的形式?因?yàn)榻涌谑嵌x某種標(biāo)準(zhǔn)的,在Collection集合中我們都可以使用到Iterator去遍歷元素,又因?yàn)镃ollection集合中的ArrayList、LinkedList等集合的數(shù)據(jù)結(jié)構(gòu)或者邏輯結(jié)構(gòu)都不相同。所以說沒有直接在Iterator中去實(shí)現(xiàn)這些集合的遍歷方法,可擴(kuò)展性太差。我們?cè)诿總€(gè)集合類中使用內(nèi)部類來實(shí)現(xiàn)對(duì)集合元素的遍歷。

各個(gè)集合的底層又是怎樣去實(shí)現(xiàn)Iterator接口的,在這里以ArrayList作為例子:

我們?cè)诩现性黾踊蛘邉h除元素的時(shí)候,為什么使用ArrayList對(duì)象直接調(diào)用增加或者刪除方法,運(yùn)行會(huì)直接報(bào)錯(cuò)?

首先要了解到Iterator的底層的核心是外部操作數(shù)和內(nèi)部操作數(shù)是否一致,當(dāng)我們?cè)诒闅v元素的時(shí)候如果對(duì)當(dāng)前遍歷數(shù)組同時(shí)進(jìn)行元素增加刪除,會(huì)導(dǎo)致臟數(shù)據(jù)的出現(xiàn)。但是我們要在遍歷數(shù)組的同時(shí)修改元素的話,我們需要使用到Iterator對(duì)象來進(jìn)行刪除或者增加。

接下來我來分析在Iterator中怎樣去刪除,以下用刪除做例子:

我們?cè)趧?chuàng)建Iterator對(duì)象的時(shí)候,會(huì)創(chuàng)建一個(gè)Itr類,該類就是ArrayList中的內(nèi)部類,在內(nèi)部類中有游標(biāo)、遍歷當(dāng)前元素的下標(biāo)、內(nèi)部操作數(shù)。首先要將在ArrayList中接收到的外部操作數(shù)賦值給內(nèi)部操作數(shù),來保證不會(huì)出現(xiàn)臟數(shù)據(jù),在內(nèi)部類中最重要的方法有hasNext()、next()等主要的方法。hasNext()主要是用游標(biāo)來判斷下一個(gè)指向是否有元素。next()方法先會(huì)檢查外部操作數(shù)和內(nèi)部操作數(shù)是否一致,不一致就直接報(bào)錯(cuò)(使用ArrayList對(duì)象來改變?cè)貍€(gè)數(shù)的時(shí)候就會(huì)出現(xiàn)此錯(cuò)誤),然后接著判斷游標(biāo)是否超過元素個(gè)數(shù),超過也會(huì)報(bào)錯(cuò)。在通過ArrayList.this來獲取ArrayList中數(shù)據(jù)容器,通過游標(biāo)+1來實(shí)現(xiàn)游標(biāo)下沉,最后返回容器中的元素。remove()方法,先判斷遍歷元素的下標(biāo)是否合法,不合法就報(bào)錯(cuò),通過ArrayList.this來調(diào)用外部類ArrayList類中的remove方法,就是使用數(shù)組的復(fù)制,將變化后的新數(shù)組賦值給以前的數(shù)組。在使用外部類的方法時(shí)外部操作數(shù)會(huì)變化,我們需要重新將外部操作數(shù)賦值給內(nèi)部操作數(shù),這樣才能保證臟數(shù)據(jù)不能出現(xiàn)。

手撕LinkedList底層源碼:

LinkedList的底層數(shù)據(jù)結(jié)構(gòu)是雙向鏈表,因?yàn)槭擎湵斫Y(jié)構(gòu),所以在LinkedList中會(huì)存在一個(gè)Node節(jié)點(diǎn)類,有三個(gè)參數(shù),指向上一個(gè)節(jié)點(diǎn)的引用地址、指向下一個(gè)節(jié)點(diǎn)的引用地址、元素。 因?yàn)長(zhǎng)inkedList還是屬于Collection家族所以在遍歷的時(shí)候還是使用Iterator或者使用ListIterator來遍歷集合。

Iterator和ListIterator的區(qū)別是

1.兩者遍歷范圍不一樣;Iterator的遍歷范圍是在整個(gè)collection集合中,ListIterator是適用于List集合中

2.遍歷的順序也不相同;Iterator的順序是正序遍歷,ListIterator是可以正向遍歷也可以倒序遍歷

3.ListIterator實(shí)現(xiàn)的方法要多一些

4.ListIterator可以設(shè)置下標(biāo),所以可以從指定下標(biāo)遍歷,在調(diào)用listIterator方法時(shí)會(huì)創(chuàng)建ListItr對(duì)象,在這個(gè)對(duì)象中也會(huì)存在外部操作數(shù),思想與Iterator一致,也有hasNext()和next(),會(huì)多了previous()、nextIndex()、previousIndex()等可以對(duì)雙向鏈表進(jìn)行操作的方法、因?yàn)槎嗔讼聵?biāo)元素所以就可以設(shè)置下標(biāo),也能添加數(shù)據(jù)。

ListIterator在Linkedlist集合內(nèi)存中的存儲(chǔ)過程:

在類加載的時(shí)候,先會(huì)加載到方法區(qū)中,加載主類Test01.class、LinkedList、LinkedList$Node.class,同時(shí)在常量池中加載常量。當(dāng)在棧中調(diào)用主方法時(shí),LinkedList集合會(huì)被創(chuàng)建,所以堆中會(huì)出現(xiàn)一個(gè)叫做myArrayList的LinkedList對(duì)象。由myArrayList在棧中執(zhí)行add()方法將常量池中的數(shù)據(jù)加載到對(duì)象中,在添加的過程中底層使用LinkedList對(duì)象來調(diào)用linkLast方法,在第一次添加的時(shí)候,開始節(jié)點(diǎn)first和結(jié)束節(jié)點(diǎn)last都為null,首先將結(jié)束節(jié)點(diǎn)last的值賦值給新節(jié)點(diǎn)的開始節(jié)點(diǎn)l,然后創(chuàng)建新的節(jié)點(diǎn),再將新節(jié)點(diǎn)的地址賦值給結(jié)束節(jié)點(diǎn)(last=newNode),會(huì)判斷新節(jié)點(diǎn)的開始節(jié)點(diǎn)是否為空,為空證明該節(jié)點(diǎn)第一次創(chuàng)建。

千鋒教育Java入門全套視頻教程(java核心技術(shù),適合java零基礎(chǔ),Java的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
健康| 张掖市| 三都| 铜山县| 武强县| 张家川| 封丘县| 宜良县| 河北区| 迁西县| 延庆县| 资源县| 长沙县| 西峡县| 上饶市| 水富县| 青神县| 龙州县| 资兴市| 蚌埠市| 榕江县| 紫阳县| 道孚县| 德保县| 望江县| 确山县| 宝清县| 金湖县| 怀远县| 惠东县| 石楼县| 洪雅县| 班玛县| 大埔县| 林西县| 哈密市| 枣庄市| 桂平市| 玛沁县| 宣武区| 沿河|