在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) | 使用第三方库 |