面試中常問的List去重問題,你都答對了嗎?

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

1240

面試中經常被問到的list如何去重,用來考察你對list數據結構,以及相關方法的掌握,體現你的java基礎學的是否牢固。

我們大家都知道,set集合的特點就是沒有重復的元素。如果集合中的數據類型是基本數據類型,可以直接將list集合轉換成set,就會自動去除重復的元素,這個就相對比較簡單。

如下示例:

1240


輸出結果為:

1240

我們可以看到去重成功了。

在面試中被問到list去重問題,大部分回答都會是list和set互轉,利用set自動去除重復屬性的方法去重,但是這樣的回答并不會得分。

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

我們定義一個對象類:

1240


我們使用上面的set去重的方法去重:

1240


運行后輸出的結果為:

1240

我們可以看到第二個張三和最后一個張三,信息都一樣,卻沒有被去重。

當list集合中存儲的是對象時,我們需要在對象的實體類中去重寫equals()方法和hashCode()方法,如下:

1240

1240


此時運行上面的test方法,去重就成功了。

最后,我們拿出String中的equals()方法和hashCode()方法源碼來加深認識:

equals()

1240


比較兩個對象時,首先先去判斷兩個對象是否具有相同的地址,如果是同一個對象的引用,則直接放回true;如果地址不一樣,則證明不是引用同一個對象,接下來就是挨個去比較兩個字符串對象的內容是否一致,完全相等返回true,否則false。

hashCode()

1240


hashCode()官方定義:

hashcode方法返回該對象的哈希碼值。支持該方法是為哈希表提供一些優點,例如,java.util.Hashtable 提供的哈希表。

hashCode 的常規協定是:

在 Java 應用程序執行期間,在同一對象上多次調用 hashCode 方法時,必須一致地返回相同的整數,前提是對象上 equals 比較中所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另一次執行,該整數無需保持一致。

如果根據 equals(Object) 方法,兩個對象是相等的,那么在兩個對象中的每個對象上調用 hashCode 方法都必須生成相同的整數結果。

以下情況不是必需的:如果根據 equals(java.lang.Object) 方法,兩個對象不相等,那么在兩個對象中的任一對象上調用 hashCode 方法必定會生成不同的整數結果。但是,程序員應該知道,為不相等的對象生成不同整數結果可以提高哈希表的性能。

實際上,由 Object 類定義的 hashCode 方法確實會針對不同的對象返回不同的整數。(這一般是通過將該對象的內部地址轉換成一個整數來實現的,但是 JavaTM 編程語言不需要這種實現技巧。)

當equals方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定聲明相等對象必須具有相等的哈希碼。

當然,List去重的方法很多,可以用for循環或者使用java8新特性stream等等,歡迎討論!

擴展閱讀

JavaScript數組去重(12種方法,史上最全)

初學者應該了解的數據結構:Array、HashMap 與 List

Maven 的這 7 個問題你思考過沒有?

Redis 的各項功能解決了哪些問題?

深入分析 ThreadLocal 內存泄漏問題

詳解 equals() 方法和 hashCode() 方法

來源:https://mp.weixin.qq.com/s/AAeaY1-0xclmMKBXp7XVUA

轉載于:https://my.oschina.net/javafirst/blog/3043322

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/279608.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/279608.shtml
英文地址,請注明出處:http://en.pswp.cn/news/279608.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Coolite Toolkit學習筆記五:常用控件Menu和MenuPanel

Coolite Toolkit里的Menu控件和其他的.NET Web控件不一樣,如果只是設計好了Menu或是通過程序初始化菜單項,菜單是不會呈現在界面上的,因為Coolite Toolkit規定Menu控件需要一個容器來做依托,而這個讓Menu依托的控件就是MenuPanel&…

剛接觸git,提交文件時,遇到no changes added to commit

第一次用git 在提交(git commit -m add 文件名)的時候,遇到了一個no changes added to commit,大體意思是沒有將改變的東西提交成功,查了很多博客,才解決這個問題,然后自己也做一下筆記&#…

CSS中!important的使用

本篇文章使用最新的IE10以及firefox與chrome測試(截止2013年5月27日22:23:22)http://www.cnblogs.com/yudy/archive/2013/05/27/3102825.html CSS的原理: 我們知道,CSS寫在不同的地方有不同的優先級, .css文件中的定義…

windows命令提示符_如何個性化Windows命令提示符

windows命令提示符Command line interfaces can be downright boring and always seem to miss out on the fresh coats of paint liberally applied to the rest of Windows. Here’s how to add a splash of color to Command Prompt and make it unique. 命令行界面可能非常…

android-api28轉換到api19-不能編譯

安裝出現錯誤- rootponkan:/ # pm install /mnt/usb/sda1/app-debug.apkpkg: /mnt/usb/sda1/app-debug.apk Failure [INSTALL_FAILED_OLDER_SDK]查看系統和api版本 rootponkan:/ # getprop ro.build.version.release 5.1.1 rootponkan:/ # getprop ro.build.version.sdk 22將ap…

Java多線程編程 — 鎖優化

2019獨角獸企業重金招聘Python工程師標準>>> 閱讀目錄 一、盡量不要鎖住方法 二、縮小同步代碼塊,只鎖數據 三、鎖中盡量不要再包含鎖 四、將鎖私有化,在內部管理鎖 五、進行適當的鎖分解 正文 并發環境下進行編程時,需要使用鎖機…

Android Ap 開發 設計模式第六篇:原型模式

Prototype Pattern 名稱由來 不是利用類來產生實例對象,而是從一個對象實例產生出另一個新的對象實例 ,根據被視為原型的對象實例 ,建立起的另一個新的對象實例就稱為原型模式(Ptototype Pattern)。 需求場景 種類過多…

netty實現客戶端服務端心跳重連

前言: 公司的加密機調度系統一直使用的是http請求調度的方式去調度,但是會出現網絡故障導致某個客戶端或者服務端斷線的情況,導致很多請求信息以及回執信息丟失的情況,接著我們拋棄了http的方式,改為Tcp的方式去建立客…

為什么您仍然不應該購買《星球大戰:前線II》

If you’ve been following video game news at all for the last couple of weeks, you’ve probably heard that EA’s Star Wars: Battlefront II is having some teething troubles. EA has backpedaled to avoid more controversy, but we’re here to say: don’t fall f…

web 后臺返回json格式數據的方式(status 406)

1.在類上使用注解 RestController public class HttpComentInterface {} 2.在方法是使用注解 ResponseBody RequestMapping(path "/interface/queryRemote", method RequestMethod.POST) //可以指定請求方式ResponseBody public RemoteCommentResultData queryCo…

OpenStack Juno系列之計算節點搭建

OpenStack Juno系列之計算節點搭建 nova-compute安裝配置 -------------------- apt-get install nova-compute sysfsutils 編輯配置文件 vi /etc/nova/nova.conf [DEFAULT] verbose True rpc_backend rabbit rabbit_host controller rabbit_password RABBIT_PASS auth_str…

quantum_如何從Firefox Quantum刪除Pocket

quantumFirefox Quantum has deep integration with the Pocket read-it-later service, which is now owned by Mozilla. You’ll see a Pocket page action in the address bar, a “View Pocket List” feature in the Library, and recommended articles from Pocket on th…

vue-typescript

教你搭建typescript的vue項目 自尤大神去年9月推出vue對typescript的支持后,一直想開箱嘗試vuets,最近一個新項目準備入手typescript,也遇到了很多坑,下面就一步步來吧!!! 1. 項目創建和初始化 …

Couchbase概述

Couchbase概述 Couchbase概述 Couchbase概述Couchbase最早叫Membase,是由Memcached項目組的一些頭目另立的山頭。2011年與CouchDB合并,正式命名為Couchbase。2013年,作為NoSQL技術初創企業,拿到了2500萬美元的D輪投資。截稿時止&a…

Windows 2012 - Dynamic Access Control 淺析

Windows 2012相對于前幾個版本而已,做出了大量的改進,尤其體現在安全性和虛擬化方面。Dynamic Access Control ( 動態訪問控制)是微軟在文件服務器的訪問控制上的新功能,極大的提高了安全性和靈活性。經過一天的研究學習&#xff…

windows rt_如何在Windows RT上輕松將網站添加到Flash白名單

windows rtMicrosoft’s Surface RT and other Windows RT-based machines include the Flash browser plugin, but it only runs on websites Microsoft has whitelisted. We have covered how you can add any website to the Flash whitelist, but now there’s an easier w…

powershell實現設置程序相關性腳本

公司一直有臺服務器cpu占用很高,分析出是恒生監控程序java占用很高,且三個java程序,僅其中一個很高,要恒生解決,一直未解決,導致每周重啟,我司運維都要手動進行程序相關性設置,給運維…

解決npm 的 shasum check failed for錯誤

使用npm安裝一些包失敗,類似如下報錯情況: C:\Program Files\nodejs>npm update npm npm ERR! Windows_NT 10.0.14393 npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\np…

chromebook刷機_您可以購買的最好的Chromebook,2017年版

chromebook刷機While once considered a novelty item by many tech enthusiasts, Chromebooks have broken out of the “just a browser” mold and become legitimate laptops. They’re full-featured, lightweight machines that can do everything most users need them …

Jmeter JDBC請求-----數據庫讀取數據進行參數化 通過SSH跳板機連接數據庫

前期準備: jdbc驅動:mysql-connector-java-5.1.7-bin.jar Jmeter 要鏈接MySQL數據庫,首選需要下載mysql jdbc驅動包(注:驅動包的版本一定要與你數據庫的版本匹配,驅動版本低于mysql版本有可能會導致連接失敗…