本文已收錄《Java常見面試題》系列,Gitee 開源位址:https://gitee.com/mydb/interview
List 去重指的是将 List 中的重複元素删除掉的過程。此題目考察的是對 List 疊代器、Set 集合和 JDK 8 中新特性的了解與靈活運用的能力。
List 去重有以下 3 種實作思路:
自定義方法去重,通過循環判斷目前的元素是否存在多個,如果存在多個,則删除此重複項,循環整個集合最終得到的就是一個沒有重複元素的 List;
使用 Set 集合去重,利用 Set 集合自身自帶去重功能的特性,實作 List 的去重;
使用 JDK 8 中 Stream 流的去重功能。
自定義去重的實作方法有兩種,首先我們可以建立一個新集合,通過循環原集合判斷循環的元素,是否已存在于新集合,如果不存在則插入,否則就忽略,這樣循環完,最終得到的新集合就是一個沒有重複元素的集合,具體實作代碼如下:
以上程式執行的結果如下圖所示:
自定義去重功能實作方法二,使用疊代器循環并判斷目前元素首次出現的位置(indexOf)是否等于最後出現的位置(lastIndexOf),如果不等于則說明此元素為重複元素,删除目前元素即可,這樣循環完就能得到一個沒有重複元素的集合,實作代碼如下:
Set 集合天生具備去重特性,在建立 Set 集合時可以傳遞一個 List 集合,這樣就能實作資料轉移和去重的功能了,具體實作代碼如下:
通過上述結果,我們發現了一個問題,在使用了 HashSet 去重之後,元素的先後順序竟然也發生了變化。為了能解決這個問題,我們可以使用 LinkedHashSet 來實作去重功能,具體實作代碼如下:
最後一種也是最簡單的一種去重方式,我們可以使用 JDK 8 中提供的 Stream 進行去重,Stream 中包含了一個去重方法:distinct,可以直接實作集合的去重功能,具體實作代碼如下:
本文介紹了 List 集合去重的 3 種實作思路,其中自定義去重功能實作起來相對繁瑣,而 Set 集合依靠其自帶的去重特性,可以很友善的實作去重功能,并且可以使用 LinkedHashSet 在去重的同時又保證了元素所在位置不被更改。而最後一種去重的方法,是 JDK 8 中新增的,使用 Stream 中的 distinct 方法實作去重,它的優點是不但寫法簡單,而且無需建立新的集合,是實作去重功能的首選方法。
是非審之于己,毀譽聽之于人,得失安之于數。 部落客介紹:80 後程式員,寫部落格這件事“堅持”了 12 年了,愛好:讀書、慢跑、羽毛球。 我的公衆号:Java面試真題解析
關注下面二維碼,訂閱更多精彩内容。

關注公衆号(加好友):
作者:
王磊的部落格
出處:
http://vipstone.cnblogs.com/