目录
- 通过HashSet去重(不保证顺序)
- 通过HashSet去重(保证顺序)
- 遍历后判断赋给另一个list集合去重(保证顺序)
- 通过TreeSet去重(保证顺序)
- Java8中Stream流处理(保证顺序)
在日常的业务开发中,偶尔会遇到需要将 List 集合中的重复数据去除掉的场景。这个时候可能有同学会问:为什么不直接使用 Set 或者 LinkedHashSet 呢?这样不就没有重复数据的问题了嘛?
不得不说,能提这个问题的同学很机智,一眼就看到了问题的本质。
但是,在实际的业务开发中遇到的情况会更复杂。
本文为大家总结了五个常用的List去重方式,希望有所帮助
通过HashSet去重(不保证顺序)
public static List<String> getUserList() { List<String> userList = new ArrayList<>(); userList.add("小王"); userList.add("小张"); userList.add("小詹"); userList.add("小王"); userList.add("老王"); userList.add("小詹"); return userList; } /** * 通过HashSet去重(不保证顺序) * 利用了Set的特性:元素不可重复,其底层原理是先计算每个对象的hash值,再比较元素值是否相同,如果相同,则保留最新的。 */ @Test public void removeRepeat1() { List<String> userList = getUserList(); System.out.println("去重前:" + userList); Set<String> hashSet = new HashSet<>(userList); List newList = new ArrayList(hashSet); System.out.println("去重后:" + newList); }
通过HashSet去重(保证顺序)
/** * 通过HashSet去重(保证顺序) */ @Test public void removeRepeat2() { List<String> userList = getUserList(); System.out.println("去重前:" + userList); Set set = new HashSet(); List newList = new ArrayList(); for (String str : userList) { if (set.add(str)) { newList.add(str); } } System.out.println("去重后:" + newList); }
遍历后判断赋给另一个list集合去重(保证顺序)
/** * 遍历后判断赋给另一个list集合去重(保证顺序) */ @Test public void removeRepeat3() { List<String> userList = getUserList(); System.out.println("去重前:" + userList); List<String> newList = new ArrayList<String>(); for (String str : userList) { if (!newList.contains(str)) { newList.add(str); } } System.out.println("去重后:" + newList); }
通过TreeSet去重(保证顺序)
/** * 通过TreeSet去重(保证顺序) * TreeSet集合实际上是利用TreeMap的带有一个比较器参数的构造方法实现,看JDK源码很清晰,最重要的是这个参数Comparator接口 */ @Test public void removeRepeat4() { List<String> userList = getUserList(); System.out.println("去重前:" + userList); Set<String> treeSet = new TreeSet<>(); treeSet.addAll(userList); List newList = new ArrayList(treeSet); System.out.println("去重后:" + newList); }
Java8中Stream流处理(保证顺序)
/** * Java8中Stream流处理(保证顺序) * 首先获得此list的Stream,然后调用distinct()方法。Java8中提供流的方式对数据进行处理,非常快,底层用的是forkJoin框架, * 提供了并行处理,使得多个处理器同时处理流中的数据,所以耗时非常短。 */ @Test public void removeRepeat5() { List<String> userList = getUserList(); System.out.println("去重前:" + userList); List newList = userList.stream().distinct().collect(Collectors.toList()); System.out.println("去重后:" + newList); }
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论(0)