写点什么

集合去重的境界

作者:flyhero
  • 2022 年 4 月 06 日
  • 本文字数:846 字

    阅读完需:约 3 分钟

集合去重的境界

王国维在《人间词话》中说过治学三重境界,想要成大事者会经历三个阶段,而数组去重几个方式也显示出了我们所经历的三个阶段,你在哪个阶段呢?


给定最简单的整型集合


List list = new ArrayList<>(Arrays.asList(2,4,6,7,8,2,4,8));
复制代码

第一重境界

"昨夜西风凋碧树,独上高楼,望尽天涯路。"


初入猿门,人生目标尚属迷茫,不知前路几何。


这个阶段你应该能想到的就是 使用一个新的 List,将原来的内容存入其中,如果存在了就跳过,这样最后新的 List 中就没有重复的元素了。


List newList = new ArrayList<>();for(int i=0; i<list.size(); i++){    if (!newList.contains(list.get(i))){        newList.add(list.get(i));    }}
复制代码


此种方法的时间复杂度为 O(n^2) , 时间随着集合长度的增加而指数增加。

第二重境界

"衣带渐宽终不悔,为伊消得人憔悴。"


此刻你应该有了追逐的目标,coding 虽虐你千百遍,但你仍不悔不弃。


当你学习了更多集合框架,你会发现一个 Set 接口,它的实现类要求包含的元素不能重复。


Set set = new HashSet(list);List integers = new ArrayList<Integer>(set);
复制代码


此种方法的时间复杂度为 O(n) , 时间随着集合长度的增加而线性增加。

第三重境界

"众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。"


历经千百次的磨炼寻觅,突然柳暗花明,这就是升华。


如果你再进一步学习,对 JDK8 有些了解,那么你一定知道 stream,它常用于对集合的操作,提供了非常丰富的 API。


list.parallelStream()    .distinct()    .collect(Collectors.toList());
复制代码


此种方式是比较流行的方式,时间复杂度我也不知怎么算了(手动捂脸),但利用 lambda 表达式书写起来行云流水,让人直叫爽。


但它的效率如何呢?


这个要了解一下 stream 的实现方式了,它底层使用了 JDK7 提供的 forkjoin 框架来完成,这个框架能够充分利用计算机的多核。在多核心的计算机且数据量较大的情况下,效率相对 for 循环要好很多,但仍然赶不上 set 方式;在数据量较小的情况下,stream 相对于前面两种方式较差。


所以 stream 的方式和 set 来转换方式,可以根据你的要求和喜好来选择。

发布于: 刚刚阅读数: 2
用户头像

flyhero

关注

还未添加个人签名 2019.10.11 加入

还未添加个人简介

评论

发布
暂无评论
集合去重的境界_Java_flyhero_InfoQ写作平台