阿里巴巴面试题之List集合去重

Posted 花伤情犹在

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里巴巴面试题之List集合去重相关的知识,希望对你有一定的参考价值。

第一种方案:将List集合转换成Set集合:

public class Test {
    public static void main(String[] args) {
        //将List集合去重
        List<String> list= Arrays.asList("a","b","c","c","b","a");
        list.forEach(System.out::print);//遍历List集合
        //第一种方案将List集合转换成Set集合
        Set<String> set=new HashSet<>();
        for (String lists : list){
            set.add(lists);
        }
        System.out.println("\\n-------------分割线---------------");
        set.forEach(System.out::print);//遍历Set集合
    }
}

原理:add)方法添加时,最底层的实现是先判断hashCode,再判断equals,而对于String而言,
equals比较的是值,也是相等的,所以Set集合不能有重复元素。


第二种方案:JDK8的流式编程

public class Test {
    public static void main(String[] args) {
        //将List集合去重
        List<String> list= Arrays.asList("a","b","c","c","b","a");
        list.forEach(System.out::print);//遍历List集合
        System.out.println("\\n-------------分割线---------------");
        //JDK8的流式编程
        list.stream().distinct().collect(Collectors.toList()).forEach(System.out::print);
    }
}

原理:distinct()返回由该流的不同元素组成的流。distinct()是Stream接口的方法。distinct()使用hashCode()和equals()方法来获取不同的元素。因此,我们的类必须实现hashCode()和equals()方法。如果distinct()正在处理有序流,那么对于重复元素,将保留以遭遇顺序首先出现的元素,并且以这种方式选择不同元素是稳定的。在无序流的情况下,不同元素的选择不一定是稳定的,是可以改变的。distinct()执行有状态的中间操作。在有序流的并行流的情况下,保持distinct()的稳定性是需要很高的代价的,因为它需要大量的缓冲开销。如果我们不需要保持遭遇顺序的一致性,那么我们应该可以使用通过BaseStream.unordered()方法实现的无序流。


其它方案例如循环遍历不一一列举。

以上是关于阿里巴巴面试题之List集合去重的主要内容,如果未能解决你的问题,请参考以下文章

Java面试题之List,Set和Map集合总结大全

字节跳动+百度+阿里巴巴高频面试题之链表专题

字节跳动+百度+阿里巴巴高频面试题之链表专题

java面试题之简单介绍一下集合框架

前端面试题之手写promise

阿里字节技术大佬都在用的List集合去重方案!