摘要:在中引入該方法,用來替換中的每個元素。的方法,只能在或之后使用,也就是確保當前指向了一個存在的項。這里使用了,該方法可以將非對象先映射為型,然后進行比較。存儲的是有序的數組,所以劃分時會按照順序進行劃分。
replaceAlljava.util.List
在Java8中引入該方法,用來替換list中的每個元素。
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之后使用,也就是確保當前Iterator指向了一個存在的項。該方法使用很方便,使用lambda運算可以很清晰的表達想要進行的替換操作。
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函數也是在1.8中引入,并且可以使用lambda表達式定義自己的比較規則,上面四種排序結果都是一樣的。這里使用了Comparator.comparingInt,該方法可以將非int對象先映射為int型,然后進行比較。
具體實現:
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為一個數組,然后再進行排序,這里采用的是merge sort。為什么要先copy下來,排序完成后再設置原list?官方解釋是在原數組上進行排序可能會導致n2log(n)的復雜度。
toArray函數將基于Collection的結構轉化成了數組結構,這里的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
說明創建的array是指向一個新的數組對象,但是數組中每一項保留的引用是指向原來的對象的。
spliteratordefault Spliteratorspliterator() { return Spliterators.spliterator(this, Spliterator.ORDERED); }
List存儲的是有序的數組,所以劃分時會按照順序進行劃分。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67707.html
摘要:說到復盤基礎,并不是所有的都會復盤,沒那個時間更沒那個必要。比如,一些基礎的語法以及條件語句,極度簡單。思前想后,我覺得整個計劃應該從集合開始,而復盤的方式就是讀源碼。通常,隊列不允許隨機訪問隊列中的元素。 ?showImg(https://segmentfault.com/img/remote/1460000020029737?w=1080&h=711); 老讀者都知道,我是自學轉行...
摘要:集合類關系是和的父接口。相等必須是對稱的,約定只能和其它相等,亦然。和接口在中引入,這個單詞是和的合成,用來分割集合以給并行處理提供方便。這些并不立即執行,而是等到最后一個函數,統一執行。 集合類關系: Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ...
摘要:顯然,開發人員認為通過下標遍歷的數組結構更加高效。在進行分裂時,原始保留中部至末尾的元素,新的保留原起始位置到中部的元素。同樣,也會進行重新賦值,使得在使用前與保持一致。在遍歷時,會調用方法,將動作施加于元素之上。 java.util.ArrayList ArrayList繼承自AbstractList,AbstractList為隨機訪問數據的結構,如數組提供了基本實現,并且提供了It...
摘要:提供了順序訪問的方法,當然,大部分方法都依賴于來實現,所以將鍋甩給了子類。實現了自己的遍歷方法利用了鏈表結構的特性,進行遍歷。其中有如下屬性記錄遍歷狀態。該方法位于中到數組中這里返回的不是,其實是 java.util.LinkedList Java中有現成的隊列可以用嗎 有,就是LinkedList。LinkedList實現的接口如下,其實也可以當做stack使用: public cl...
摘要:容器相關的操作及其源碼分析說明本文是基于分析的。通常,我們通過迭代器來遍歷集合。是接口所特有的,在接口中,通過返回一個對象。為了偷懶啊,底層使用了迭代器。即返回的和原在元素上保持一致,但不可修改。 容器相關的操作及其源碼分析 說明 1、本文是基于JDK 7 分析的。JDK 8 待我工作了得好好研究下。Lambda、Stream。 2、本文會貼出大量的官方注釋文檔,強迫自己學英語,篇幅...
閱讀 2158·2023-04-26 00:00
閱讀 3265·2021-09-24 10:37
閱讀 3534·2021-09-07 09:58
閱讀 1525·2019-08-30 15:56
閱讀 2223·2019-08-30 13:11
閱讀 2316·2019-08-29 16:38
閱讀 967·2019-08-29 12:58
閱讀 1884·2019-08-27 10:54