Java實現(xiàn)List去重的五種方法詳解
在日常的業(yè)務(wù)開發(fā)中,偶爾會遇到需要將 List 集合中的重復(fù)數(shù)據(jù)去除掉的場景。這個時候可能有同學(xué)會問:為什么不直接使用 Set 或者 LinkedHashSet 呢?這樣不就沒有重復(fù)數(shù)據(jù)的問題了嘛?
不得不說,能提這個問題的同學(xué)很機智,一眼就看到了問題的本質(zhì)。
但是,在實際的業(yè)務(wù)開發(fā)中遇到的情況會更復(fù)雜。
本文為大家總結(jié)了五個常用的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ù),其底層原理是先計算每個對象的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的帶有一個比較器參數(shù)的構(gòu)造方法實現(xiàn),看JDK源碼很清晰,最重要的是這個參數(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ù)進行處理,非??欤讓佑玫氖莊orkJoin框架,
* 提供了并行處理,使得多個處理器同時處理流中的數(shù)據(jù),所以耗時非常短。
*/
@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實現(xiàn)List去重的五種方法詳解的文章就介紹到這了,更多相關(guān)Java List去重內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Schedule定時任務(wù)在分布式產(chǎn)生的問題詳解
這篇文章主要介紹了Schedule定時任務(wù)在分布式產(chǎn)生的問題詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
jstl標(biāo)簽基礎(chǔ)開發(fā)步驟(詳解)
下面小編就為大家?guī)硪黄猨stl標(biāo)簽基礎(chǔ)開發(fā)步驟(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
一篇文章告訴你JAVA Mybatis框架的核心原理到底有多重要
yBatis的底層操作封裝了JDBC的API,MyBatis的工作原理以及核心流程與JDBC的使用步驟一脈相承,MyBatis的核心對象(SqlSession,Executor)與JDBC的核心對象(Connection,Statement)相互對應(yīng)2021-06-06
java導(dǎo)出到excel常用的幾種方式總結(jié)
導(dǎo)出excel是咱Java開發(fā)的必備技能啦,之前項目有這個功能,現(xiàn)在將其獨立出來,分享一下,下面這篇文章主要給大家介紹了關(guān)于java導(dǎo)出到excel常用的幾種方式,需要的朋友可以參考下2023-05-05
Spring Boot Event Bus用法小結(jié)
Spring Boot Event Bus是Spring框架中事件驅(qū)動編程的一部分,本文主要介紹了Spring Boot Event Bus用法小結(jié),感興趣的可以了解一下2023-09-09

