关注“Java架构栈”微信公众号,回复暗号【Java面试题】即可获取大厂面试题
问题背景
最近就有很多小伙伴在后台私信波哥,问波哥这样一个问题:“波哥,我最近正在找工作,被面试官问到List该怎么去重?我感觉自己的回答没有get到面试官的预期结果,请问波哥这个问题怎么回答才能让面试官满意呢?” 对于这个问题,波哥会建议大家采用JDK 8中的stream进行去重,为什么呢?请看接下来波哥给大家的分析吧。
List去重方式
为了让大家能够比较完美地回答这个问题,波哥会给大家展示以下几种经典的去重方式。
2.1 迭代器去重
第一种方式,我们可以使用迭代器来循环判断每一项数据,如果当前循环到的数据,在集合中存在两份或两份以上,就将当前的元素删除掉。这样循环完之后,我们就可以得到一个没有重复数据的集合,这是一种比较常见的去重方式,其实现代码如下:
public class ListTest {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>() {{add(2); add(5); add(9);add(2); add(4); add(9);add(3); add(7); add(8);}};System.out.println("原list:"+list);test(list); }public static void test(List<Integer> list){Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()){Integer integer = iterator.next();if(list.indexOf(integer)!=list.lastIndexOf(integer)){iterator.remove();} }System.out.println("新list:"+list); }}
运行上面的代码会得到以下结果:
但是细心的你可以或许可以看到,在使用迭代器去重的时候,List结果的顺序是混乱的,跟原来的集合顺序并不一样,这如何搞?
2.2 Stream去重
这个时候,波哥就要给小伙伴介绍一种新的实现方案了。如果你可以回答出这一点,我相信面试官会满意的颔首的。这种实现方式,是利用JDK8为我们带来的Stream流。使用Stream可以让我们轻松地实现很多功能,比如下面的去重效果:
public class ListTest {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>() {{add(2); add(5); add(9);add(2); add(4); add(9);add(3); add(7); add(8);}};System.out.println("原list:"+list);test(list);}public static void test(List<Integer> list){list=list.stream().distinct().collect(Collectors.toList());System.out.println("新list:"+list); }
}
现在你看,上面的实现代码比迭代器的实现方式更简单,运行上面的代码会得到以下结果:
而且利用stream()方法,我们不仅对运行结果实现了去重,还没有改变原来的集合元素顺序,保证了集合内容的有序性,这比传统的去重方式更简单有效,且性能也更高哦!
小结
除了以上两种方式之外,其实我们还有一些别的方法也可以对List集合去重。本文波哥只是给大家讲解了以上两种,就当是抛砖引玉吧,如果你还知道别的方式,可以在评论区给出你的答案。今天的内容你学会了吗?关注Java架构栈,干货天天都不断!