![ee3c39e9913f1e888b0c46164ecb1acd.png](https://img-blog.csdnimg.cn/img_convert/ee3c39e9913f1e888b0c46164ecb1acd.png)
原文阅读:
集合去重三境界mp.weixin.qq.com![3cafd80abad5b77a90f896b3253276e8.png](https://img-blog.csdnimg.cn/img_convert/3cafd80abad5b77a90f896b3253276e8.png)
王国维在《人间词话》中说过治学三重境界,想要成大事者会经历三个阶段,而数组去重几个方式也显示出了我们所经历的三个阶段,你在哪个阶段呢?
给定最简单的整型集合
List
第一重境界
★ 昨夜西风凋碧树,独上高楼,望尽天涯路。
”
初入猿门,人生目标尚属迷茫,不知前路几何。
这个阶段你应该能想到的就是 使用一个新的List,将原来的内容存入其中,如果存在了就跳过,这样最后新的List中就没有重复的元素了。
List
此种方法的时间复杂度为 O(n^2) , 时间随着集合长度的增加而指数增加。
第二重境界
★ 衣带渐宽终不悔,为伊消得人憔悴。
”
此刻你应该有了追逐的目标,coding虽虐你千百遍,但你仍不悔不弃。
当你学习了更多集合框架,你会发现一个Set接口,它的实现类要求包含的元素不能重复。
Set
此种方法的时间复杂度为 O(n) , 时间随着集合长度的增加而线性增加。
第三重境界
★ 众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。
”
历经千百次的磨炼寻觅,突然柳暗花明,这就是升华。
如果你再进一步学习,对JDK8有些了解,那么你一定知道stream,它常用于对集合的操作,提供了非常丰富的API。
list.parallelStream()
.distinct()
.collect(Collectors.toList());
此种方式是比较流行的方式,时间复杂度我也不知怎么算了(手动捂脸),但利用lambda表达式书写起来行云流水,让人直叫爽。
但它的效率如何呢?
这个要了解一下stream的实现方式了,它底层使用了JDK7提供的forkjoin框架来完成,这个框架能够充分利用计算机的多核。 在多核心的计算机且数据量较大的情况下,效率相对for循环要好很多,但仍然赶不上set方式; 在数据量较小的情况下,stream相对于前面两种方式较差。
所以stream的方式和set来转换方式,可以根据你的要求和喜好来选择。