Java實(shí)現(xiàn)List去重的五種方法詳解
在日常的業(yè)務(wù)開發(fā)中,偶爾會(huì)遇到需要將 List 集合中的重復(fù)數(shù)據(jù)去除掉的場景。這個(gè)時(shí)候可能有同學(xué)會(huì)問:為什么不直接使用 Set 或者 LinkedHashSet 呢?這樣不就沒有重復(fù)數(shù)據(jù)的問題了嘛?
不得不說,能提這個(gè)問題的同學(xué)很機(jī)智,一眼就看到了問題的本質(zhì)。
但是,在實(shí)際的業(yè)務(wù)開發(fā)中遇到的情況會(huì)更復(fù)雜。
本文為大家總結(jié)了五個(gè)常用的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的特性:元素不可重復(fù),其底層原理是先計(jì)算每個(gè)對象的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); }
遍歷后判斷賦給另一個(gè)list集合去重(保證順序)
/** * 遍歷后判斷賦給另一個(gè)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集合實(shí)際上是利用TreeMap的帶有一個(gè)比較器參數(shù)的構(gòu)造方法實(shí)現(xiàn),看JDK源碼很清晰,最重要的是這個(gè)參數(shù)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,然后調(diào)用distinct()方法。Java8中提供流的方式對數(shù)據(jù)進(jìn)行處理,非???,底層用的是forkJoin框架, * 提供了并行處理,使得多個(gè)處理器同時(shí)處理流中的數(shù)據(jù),所以耗時(shí)非常短。 */ @Test public void removeRepeat5() { List<String> userList = getUserList(); System.out.println("去重前:" + userList); List newList = userList.stream().distinct().collect(Collectors.toList()); System.out.println("去重后:" + newList); }
到此這篇關(guān)于Java實(shí)現(xiàn)List去重的五種方法詳解的文章就介紹到這了,更多相關(guān)Java List去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Schedule定時(shí)任務(wù)在分布式產(chǎn)生的問題詳解
這篇文章主要介紹了Schedule定時(shí)任務(wù)在分布式產(chǎn)生的問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Java死鎖代碼實(shí)例及產(chǎn)生死鎖必備的四個(gè)條件
這篇文章主要介紹了Java死鎖代碼實(shí)例及產(chǎn)生死鎖必備的四個(gè)條件,Java 發(fā)生死鎖的根本原因是,在申請鎖時(shí)發(fā)生了交叉閉環(huán)申請,synchronized在開發(fā)中最好不要嵌套使用,容易導(dǎo)致死鎖,需要的朋友可以參考下2024-01-01jstl標(biāo)簽基礎(chǔ)開發(fā)步驟(詳解)
下面小編就為大家?guī)硪黄猨stl標(biāo)簽基礎(chǔ)開發(fā)步驟(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要
yBatis的底層操作封裝了JDBC的API,MyBatis的工作原理以及核心流程與JDBC的使用步驟一脈相承,MyBatis的核心對象(SqlSession,Executor)與JDBC的核心對象(Connection,Statement)相互對應(yīng)2021-06-06java導(dǎo)出到excel常用的幾種方式總結(jié)
導(dǎo)出excel是咱Java開發(fā)的必備技能啦,之前項(xiàng)目有這個(gè)功能,現(xiàn)在將其獨(dú)立出來,分享一下,下面這篇文章主要給大家介紹了關(guān)于java導(dǎo)出到excel常用的幾種方式,需要的朋友可以參考下2023-05-05Spring Boot Event Bus用法小結(jié)
Spring Boot Event Bus是Spring框架中事件驅(qū)動(dòng)編程的一部分,本文主要介紹了Spring Boot Event Bus用法小結(jié),感興趣的可以了解一下2023-09-09