Java中List去重問題分析

2020-10-05 11:01:12

概述

我們大家都知道,set集合的特點就沒有重複的元素,如果集合中的資料型別是基本資料型別,可以直接將list集合轉換成set,就會自動去除重複的元素,這個就相對比較簡單。
如下範例
在這裡插入圖片描述
輸出結果為
在這裡插入圖片描述
我們可以看到去重成功了。
在面試中被問到List去重問題,大部分回答都是會list和set互轉,利用set自動去重的方法去重,但是這樣的回答並不會得分。

元素為物件型別時

當list集合中儲存的型別是物件型別的時候,我們就不能簡單的只把list集合轉換成set集合。

我們定義一個物件類:
在這裡插入圖片描述
我們使用上面的set去重的方法去重:
在這裡插入圖片描述
執行後輸出的結果為:
在這裡插入圖片描述
我們可以看到第二個張三和最後一個張三,資訊都一樣,卻沒有被去重。

當list集合儲存的是物件時,我們需要在物件的實體類中去重寫equals()方法和hashCode()方法,如下:
在這裡插入圖片描述
此時執行上面的test方法,去重就成功了。

最後,我們拿出String中的equals()方法和hashCode()方法原始碼來加深認識:
equals()
在這裡插入圖片描述
比較兩個物件時,首先先去判斷兩個物件是否具有相同的地址,如果是同一個物件的參照,則直接返回true,如果地址不一樣,則證明不是參照同一個物件,接下來就是挨個去比較兩個字串物件的內容是否一致,完全相等返回true,否則false.

hashCode()
在這裡插入圖片描述
當equals方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定宣告相等物件必須具有相等的雜湊碼。當然,List去重的方法很多,可以用for迴圈或者使用java8新特性stream等等。