集合之List--List如何去重

在java中,List是一个允许重复元素的有序集合,如果需要对List去重

一、HashSet去重

HashSet是一个不允许重复元素的集合,利用这一特性可以快速去重

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("A"); // 重复元素
​
// 使用 HashSet 去重
Set<String> set = new HashSet<>(list); // 自动去重
List<String> result = new ArrayList<>(set); // 转换回 List
​
System.out.println(result); // 输出: [A, B]

注意:

  • HashSet不保证元素的顺序。如果需要保留原始顺序,可以使用LinkedHashSet

Set<String> set = new LinkedHashSet<>(list); // 保留顺序
List<String> result = new ArrayList<>(set);

二、使用Java8的Stream API

java8引发了Stream API,可以方便地对集合进行操作,包括去重

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("A"); // 重复元素
​
// 使用 Stream 去重
List<String> result = list.stream()
                          .distinct() // 去重
                          .collect(Collectors.toList()); // 收集为 List
​
System.out.println(result); // 输出: [A, B]

优点:

  • 代码简单,适合函数式编程风格

  • 保留原始顺序

三、手动遍历去重

如果不想依赖额外的集合类,可以手动遍历List并去重

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("A"); // 重复元素
​
List<String> result = new ArrayList<>();
for (String item : list) {
    if (!result.contains(item)) { // 检查是否已存在
        result.add(item);
    }
}
​
System.out.println(result); // 输出: [A, B]

注意:

  • 这种方法的时间复杂度较高O(n²),因为每次都需要调用contains方法检查元素是否存在

  • 适合数据量较小的场景

四、使用TreeSet去重并排序

如果需要对元素去重并排序,可以使用TreeSet

List<String> list = new ArrayList<>();
list.add("C");
list.add("B");
list.add("A");
list.add("B"); // 重复元素
​
// 使用 TreeSet 去重并排序
Set<String> set = new TreeSet<>(list); // 自动去重并排序
List<String> result = new ArrayList<>(set);
​
System.out.println(result); // 输出: [A, B, C]

注意:

  • TreeSet会对元素进行自然排序(或根据自定义比较器排序)

  • 如果需要保留原始顺序,不要使用TreeSet

五、使用Apache Commons Collections

如果你使用了Apache Commons Collections库,可以使用CollectionUtils工具类去重

List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("A"); // 重复元素
​
// 使用 CollectionUtils 去重
List<String> result = new ArrayList<>(CollectionUtils.removeDuplicates(list));
​
System.out.println(result); // 输出: [A, B]

总结

方法是否保留顺序时间复杂度适用场景
HashSet不保留O(n)快速去重,不关心顺序
LinkedHashSet保留O(n)快速去重,保留顺序
Stream.distinct()保留O(n)函数式编程风格
手动遍历去重保留O(n²)数据量较小
TreeSet排序O(n log n)去重并排序
Apache Commons Collections保留O(n)使用第三方库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值