摘要:在中引入該方法,用來替換中的每個(gè)元素。的方法,只能在或之后使用,也就是確保當(dāng)前指向了一個(gè)存在的項(xiàng)。這里使用了,該方法可以將非對象先映射為型,然后進(jìn)行比較。存儲的是有序的數(shù)組,所以劃分時(shí)會按照順序進(jìn)行劃分。
replaceAlljava.util.List
在Java8中引入該方法,用來替換list中的每個(gè)元素。
default void replaceAll(UnaryOperatoroperator) { Objects.requireNonNull(operator); final ListIterator li = this.listIterator(); while (li.hasNext()) { li.set(operator.apply(li.next())); } }
Iterator的set方法,只能在next或previous之后使用,也就是確保當(dāng)前Iterator指向了一個(gè)存在的項(xiàng)。該方法使用很方便,使用lambda運(yùn)算可以很清晰的表達(dá)想要進(jìn)行的替換操作。
public class Ripper { public static void main(String[] args) { Listsortnumbers = new ArrayList<>(); for (int i = 0; i < 10; i++) { numbers.add(i); } numbers.replaceAll(item -> item * item); } }
public class Ripper { public static void main(String[] args) { Listnumbers = new ArrayList<>(); for (int i = 10; i > 0; i--) { numbers.add(i); } numbers.sort(Integer::compare); numbers.sort(null); numbers.sort((a, b) -> a - b); numbers.sort(Comparator.comparingInt(a -> a * a)); } }
同樣sort函數(shù)也是在1.8中引入,并且可以使用lambda表達(dá)式定義自己的比較規(guī)則,上面四種排序結(jié)果都是一樣的。這里使用了Comparator.comparingInt,該方法可以將非int對象先映射為int型,然后進(jìn)行比較。
具體實(shí)現(xiàn):
default void sort(Comparator super E> c) { Object[] a = this.toArray(); Arrays.sort(a, (Comparator) c); ListIteratori = this.listIterator(); for (Object e : a) { i.next(); i.set((E) e); } }
這里首先將原來的list的copy為一個(gè)數(shù)組,然后再進(jìn)行排序,這里采用的是merge sort。為什么要先copy下來,排序完成后再設(shè)置原list?官方解釋是在原數(shù)組上進(jìn)行排序可能會導(dǎo)致n2log(n)的復(fù)雜度。
toArray函數(shù)將基于Collection的結(jié)構(gòu)轉(zhuǎn)化成了數(shù)組結(jié)構(gòu),這里的ListArray的toArray方法是淺拷貝,從下面例子可以看出:
public class Ripper { int value; public Ripper(int v) { value = v; } public static void main(String[] args) { Listnumbers = new ArrayList<>(); for (int i = 10; i > 0; i--) { numbers.add(new Ripper(i)); } Object[] array = numbers.toArray(); array[0] = array[1]; System.out.println(numbers.get(0).value); Ripper a1 = (Ripper) array[0]; a1.value = 100; System.out.println(numbers.get(0).value); System.out.println(numbers.get(1).value); } }
輸出是:
10 10 100
說明創(chuàng)建的array是指向一個(gè)新的數(shù)組對象,但是數(shù)組中每一項(xiàng)保留的引用是指向原來的對象的。
spliteratordefault Spliteratorspliterator() { return Spliterators.spliterator(this, Spliterator.ORDERED); }
List存儲的是有序的數(shù)組,所以劃分時(shí)會按照順序進(jìn)行劃分。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67707.html
摘要:說到復(fù)盤基礎(chǔ),并不是所有的都會復(fù)盤,沒那個(gè)時(shí)間更沒那個(gè)必要。比如,一些基礎(chǔ)的語法以及條件語句,極度簡單。思前想后,我覺得整個(gè)計(jì)劃應(yīng)該從集合開始,而復(fù)盤的方式就是讀源碼。通常,隊(duì)列不允許隨機(jī)訪問隊(duì)列中的元素。 ?showImg(https://segmentfault.com/img/remote/1460000020029737?w=1080&h=711); 老讀者都知道,我是自學(xué)轉(zhuǎn)行...
摘要:集合類關(guān)系是和的父接口。相等必須是對稱的,約定只能和其它相等,亦然。和接口在中引入,這個(gè)單詞是和的合成,用來分割集合以給并行處理提供方便。這些并不立即執(zhí)行,而是等到最后一個(gè)函數(shù),統(tǒng)一執(zhí)行。 集合類關(guān)系: Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ...
摘要:顯然,開發(fā)人員認(rèn)為通過下標(biāo)遍歷的數(shù)組結(jié)構(gòu)更加高效。在進(jìn)行分裂時(shí),原始保留中部至末尾的元素,新的保留原起始位置到中部的元素。同樣,也會進(jìn)行重新賦值,使得在使用前與保持一致。在遍歷時(shí),會調(diào)用方法,將動作施加于元素之上。 java.util.ArrayList ArrayList繼承自AbstractList,AbstractList為隨機(jī)訪問數(shù)據(jù)的結(jié)構(gòu),如數(shù)組提供了基本實(shí)現(xiàn),并且提供了It...
摘要:提供了順序訪問的方法,當(dāng)然,大部分方法都依賴于來實(shí)現(xiàn),所以將鍋甩給了子類。實(shí)現(xiàn)了自己的遍歷方法利用了鏈表結(jié)構(gòu)的特性,進(jìn)行遍歷。其中有如下屬性記錄遍歷狀態(tài)。該方法位于中到數(shù)組中這里返回的不是,其實(shí)是 java.util.LinkedList Java中有現(xiàn)成的隊(duì)列可以用嗎 有,就是LinkedList。LinkedList實(shí)現(xiàn)的接口如下,其實(shí)也可以當(dāng)做stack使用: public cl...
摘要:容器相關(guān)的操作及其源碼分析說明本文是基于分析的。通常,我們通過迭代器來遍歷集合。是接口所特有的,在接口中,通過返回一個(gè)對象。為了偷懶啊,底層使用了迭代器。即返回的和原在元素上保持一致,但不可修改。 容器相關(guān)的操作及其源碼分析 說明 1、本文是基于JDK 7 分析的。JDK 8 待我工作了得好好研究下。Lambda、Stream。 2、本文會貼出大量的官方注釋文檔,強(qiáng)迫自己學(xué)英語,篇幅...
閱讀 2142·2023-04-26 00:00
閱讀 3240·2021-09-24 10:37
閱讀 3529·2021-09-07 09:58
閱讀 1518·2019-08-30 15:56
閱讀 2218·2019-08-30 13:11
閱讀 2311·2019-08-29 16:38
閱讀 960·2019-08-29 12:58
閱讀 1876·2019-08-27 10:54