面试中常问的List去重问题,你都答对了吗?
?
面試中經(jīng)常被問到的list如何去重,用來考察你對list數(shù)據(jù)結(jié)構(gòu),以及相關(guān)方法的掌握,體現(xiàn)你的java基礎(chǔ)學(xué)的是否牢固。
我們大家都知道,set集合的特點(diǎn)就是沒有重復(fù)的元素。如果集合中的數(shù)據(jù)類型是基本數(shù)據(jù)類型,可以直接將list集合轉(zhuǎn)換成set,就會自動去除重復(fù)的元素,這個(gè)就相對比較簡單。
如下示例:
輸出結(jié)果為:
我們可以看到去重成功了。
在面試中被問到list去重問題,大部分回答都會是list和set互轉(zhuǎn),利用set自動去除重復(fù)屬性的方法去重,但是這樣的回答并不會得分。
當(dāng)list集合中存儲的類型是對象類型的時(shí)候,我們就不能簡單的只把list集合轉(zhuǎn)換成set集合。
我們定義一個(gè)對象類:
我們使用上面的set去重的方法去重:
運(yùn)行后輸出的結(jié)果為:
我們可以看到第二個(gè)張三和最后一個(gè)張三,信息都一樣,卻沒有被去重。
當(dāng)list集合中存儲的是對象時(shí),我們需要在對象的實(shí)體類中去重寫equals()方法和hashCode()方法,如下:
此時(shí)運(yùn)行上面的test方法,去重就成功了。
最后,我們拿出String中的equals()方法和hashCode()方法源碼來加深認(rèn)識:
equals()
比較兩個(gè)對象時(shí),首先先去判斷兩個(gè)對象是否具有相同的地址,如果是同一個(gè)對象的引用,則直接放回true;如果地址不一樣,則證明不是引用同一個(gè)對象,接下來就是挨個(gè)去比較兩個(gè)字符串對象的內(nèi)容是否一致,完全相等返回true,否則false。
hashCode()
hashCode()官方定義:
hashcode方法返回該對象的哈希碼值。支持該方法是為哈希表提供一些優(yōu)點(diǎn),例如,java.util.Hashtable 提供的哈希表。
hashCode 的常規(guī)協(xié)定是:
在 Java 應(yīng)用程序執(zhí)行期間,在同一對象上多次調(diào)用 hashCode 方法時(shí),必須一致地返回相同的整數(shù),前提是對象上 equals 比較中所用的信息沒有被修改。從某一應(yīng)用程序的一次執(zhí)行到同一應(yīng)用程序的另一次執(zhí)行,該整數(shù)無需保持一致。
如果根據(jù) equals(Object) 方法,兩個(gè)對象是相等的,那么在兩個(gè)對象中的每個(gè)對象上調(diào)用 hashCode 方法都必須生成相同的整數(shù)結(jié)果。
以下情況不是必需的:如果根據(jù) equals(java.lang.Object) 方法,兩個(gè)對象不相等,那么在兩個(gè)對象中的任一對象上調(diào)用 hashCode 方法必定會生成不同的整數(shù)結(jié)果。但是,程序員應(yīng)該知道,為不相等的對象生成不同整數(shù)結(jié)果可以提高哈希表的性能。
實(shí)際上,由 Object 類定義的 hashCode 方法確實(shí)會針對不同的對象返回不同的整數(shù)。(這一般是通過將該對象的內(nèi)部地址轉(zhuǎn)換成一個(gè)整數(shù)來實(shí)現(xiàn)的,但是 JavaTM 編程語言不需要這種實(shí)現(xiàn)技巧。)
當(dāng)equals方法被重寫時(shí),通常有必要重寫 hashCode 方法,以維護(hù) hashCode 方法的常規(guī)協(xié)定,該協(xié)定聲明相等對象必須具有相等的哈希碼。
當(dāng)然,List去重的方法很多,可以用for循環(huán)或者使用java8新特性stream等等,歡迎討論!
擴(kuò)展閱讀
JavaScript數(shù)組去重(12種方法,史上最全)
初學(xué)者應(yīng)該了解的數(shù)據(jù)結(jié)構(gòu):Array、HashMap 與 List
Maven 的這 7 個(gè)問題你思考過沒有?
Redis 的各項(xiàng)功能解決了哪些問題?
深入分析 ThreadLocal 內(nèi)存泄漏問題
詳解 equals() 方法和 hashCode() 方法
來源:https://mp.weixin.qq.com/s/AAeaY1-0xclmMKBXp7XVUA
轉(zhuǎn)載于:https://www.cnblogs.com/javafirst0/p/10782202.html
總結(jié)
以上是生活随笔為你收集整理的面试中常问的List去重问题,你都答对了吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORA-08176 错误的一个案例
- 下一篇: BZOJ 4710: [Jsoi2011