博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java容器类研究2:List
阅读量:6698 次
发布时间:2019-06-25

本文共 2373 字,大约阅读时间需要 7 分钟。

java.util.List

replaceAll

在Java8中引入该方法,用来替换list中的每个元素。

default void replaceAll(UnaryOperator
operator) { 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) {        List
numbers = new ArrayList<>(); for (int i = 0; i < 10; i++) { numbers.add(i); } numbers.replaceAll(item -> item * item); }}

sort

public class Ripper {    public static void main(String[] args) {        List
numbers = 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
c) { Object[] a = this.toArray(); Arrays.sort(a, (Comparator) c); ListIterator
i = 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) {        List
numbers = 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); }}

输出是:

1010100

说明创建的array是指向一个新的数组对象,但是数组中每一项保留的引用是指向原来的对象的。

spliterator

default Spliterator
spliterator() { return Spliterators.spliterator(this, Spliterator.ORDERED); }

List存储的是有序的数组,所以划分时会按照顺序进行划分。

转载地址:http://hamoo.baihongyu.com/

你可能感兴趣的文章
李飞飞:为什么计算机视觉对机器人如此重要?
查看>>
Unity AI副总裁Danny Lange:如何用AI助推游戏行业?
查看>>
《Effective Objective-C 2.0》1、熟悉Objective-C
查看>>
用 Flask 来写个轻博客 (1) — 创建项目
查看>>
OpenSceneGraph in ActiveX by ActiveQt
查看>>
南海发展大数据产业 建设新型智慧城市
查看>>
安卓APP破解利器之FRIDA
查看>>
数据中心传输需求成以太网市场巨大推动力
查看>>
华院数据宣晓华:传统零售商转型电商需攻克大数据三关
查看>>
主打“云安全” 迅雷系帝恩思登陆新三板
查看>>
研究人员发现Office Word 0Day攻击 这个漏洞绕过了word宏安全设置 绿盟科技、McAfee及FireEye发出警告...
查看>>
Apache日志记录组件Log4j出现反序列化漏洞 黑客可以执行任意代码 所有2.x版本均受影响...
查看>>
希捷宣布出货双碟装1TB硬盘 单碟500GB上市
查看>>
MPLS服务合同到期了,是否该续签?
查看>>
物联网世界的承诺与挑战
查看>>
亚马逊低调收购Biba 或下月发布视频消息服务
查看>>
预防和检测如日中天?事件响应表示不服
查看>>
安全和连接是IoT联网设备2大挑战
查看>>
张震博士:SDT是未来安防发展方向
查看>>
CloudCC CRM:物联网必将成为CRM的推动力
查看>>