Java實(shí)現(xiàn)List去重的五種方法詳解
在日常的業(yè)務(wù)開(kāi)發(fā)中,偶爾會(huì)遇到需要將 List 集合中的重復(fù)數(shù)據(jù)去除掉的場(chǎng)景。這個(gè)時(shí)候可能有同學(xué)會(huì)問(wèn):為什么不直接使用 Set 或者 LinkedHashSet 呢?這樣不就沒(méi)有重復(fù)數(shù)據(jù)的問(wèn)題了嘛?
不得不說(shuō),能提這個(gè)問(wèn)題的同學(xué)很機(jī)智,一眼就看到了問(wèn)題的本質(zhì)。
但是,在實(shí)際的業(yè)務(wù)開(kāi)發(fā)中遇到的情況會(huì)更復(fù)雜。
本文為大家總結(jié)了五個(gè)常用的List去重方式,希望有所幫助
通過(guò)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;
}
/**
* 通過(guò)HashSet去重(不保證順序)
* 利用了Set的特性:元素不可重復(fù),其底層原理是先計(jì)算每個(gè)對(duì)象的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);
}通過(guò)HashSet去重(保證順序)
/**
* 通過(guò)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);
}通過(guò)TreeSet去重(保證順序)
/**
* 通過(guò)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中提供流的方式對(duì)數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis工具類JdbcTypeInterceptor運(yùn)行時(shí)自動(dòng)添加jdbcType屬性
今天小編就為大家分享一篇關(guān)于Mybatis工具類JdbcTypeInterceptor運(yùn)行時(shí)自動(dòng)添加jdbcType屬性,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
Java高級(jí)架構(gòu)之FastDFS分布式文件集群詳解
這篇文章主要介紹了Java高級(jí)架構(gòu)之FastDFS分布式文件集群詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
詳解Spring ApplicationContext加載過(guò)程
這篇文章主要介紹了Spring ApplicationContext加載過(guò)程的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用spring框架,感興趣的朋友可以了解下2021-03-03
Spring Cloud與分布式系統(tǒng)簡(jiǎn)析
這篇文章主要介紹了Spring Cloud與分布式系統(tǒng)的相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-09-09
Java之如何正確地對(duì)包裝類進(jìn)行裝箱與拆箱
在這篇文章中給大家繼續(xù)講解包裝類的裝箱和拆箱問(wèn)題。你可能會(huì)很好奇,做java開(kāi)發(fā),怎么還裝起箱子來(lái)了?那么就請(qǐng)大家?guī)е苫笸驴窗?/div> 2023-04-04最新評(píng)論

