精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

大佬也Hashcode方法上翻船了,不小心秀了一把!

開發 前端
大佬解決問題思路值得我們先學習一波,在大佬決定最終放棄的前,給我發消息了,問有興趣看一看沒。有這么奇怪的現象,怎能不研究一下呢?

 [[389669]]

本文轉載自微信公眾號「程序新視界 」,作者二師兄。轉載本文請聯系程序新視界 公眾號。   

前些天寫了幾篇面試題的文章,其中包括《重寫equals方法為什么通常會重寫hashcode方法?》,有朋友可能會說,這類面試題都是“面試造火箭,工作擰螺絲”。不可否認,有些面試題的確如此。

但就在今天,因為懂了這篇文章中的知識竟然在大佬面前秀了一把,幫大佬解決了疑問,還換來了一個趕明兒請吃飯的“口頭支票”,哈哈~~

下面就來聊聊大佬遇到的奇怪問題以及排查解決過程。

大佬的疑惑

大佬在項目中寫了類似這樣的一段代碼:

  1. List<ProjectId> list = new ArrayList<>(); 
  2. // 省略add數據操作 
  3. List<DeviceModel> models =  list.stream().map(ProjectId::getDeviceModel).distinct().collect(Collectors.toList()); 
  4. System.out.println(models); 

結果呢,這段代碼中的distinct()方法并沒有起效,并沒有達到去重的預期。

但大佬并沒有放棄,先是查了該方法的文檔:

Returns a stream consisting of the distinct elements (according to Object.equals(Object)) of this stream.

For ordered streams, the selection of distinct elements is stable (for duplicated elements, the element appearing first in the encounter order is preserved.) For unordered streams, no stability guarantees are made.

This is a stateful intermediate operation.

通過API文檔來看并沒有問題,進而大佬開啟了debug模式,發現奇怪的是實體類的equals方法都沒進。

大佬解決問題思路值得我們先學習一波,在大佬決定最終放棄的前,給我發消息了,問有興趣看一看沒。有這么奇怪的現象,怎能不研究一下呢?

解決思路

根據大佬發的部分代碼和實現思路,把整個模擬的測試程序補充完整,創建了兩個實體類ProjectId和DeviceModel,并重寫了equals方法(跟大佬溝通,他重寫了equals方法,并且單獨使用是生效的)。

DeviceModel實體類,簡單重寫了equals方法,只比較字段no是否相等。

  1. @Data 
  2. public class DeviceModel { 
  3.  
  4.     private String no
  5.  
  6.     @Override 
  7.     public String toString(){ 
  8.         return no
  9.     } 
  10.  
  11.     @Override 
  12.     public boolean equals(Object other) { 
  13.  
  14.         if (this == other) { 
  15.             return true
  16.         } 
  17.         if (other == null || getClass() != other.getClass()) { 
  18.             return false
  19.         } 
  20.  
  21.         return this.toString().equals(other.toString()); 
  22.     } 

ProjectId實體類,重寫了equals方法,

  1. @Data 
  2. public class ProjectId { 
  3.  
  4.     private int id; 
  5.  
  6.     private DeviceModel deviceModel; 

然后,構建了測試類:

  1. public class Test { 
  2.  
  3.     public static void main(String[] args) { 
  4.  
  5.         List<ProjectId> list = new ArrayList<>(); 
  6.  
  7.         DeviceModel device1 = new DeviceModel(); 
  8.         device1.setNo("1"); 
  9.         ProjectId projectId1 = new ProjectId(); 
  10.         projectId1.setDeviceModel(device1); 
  11.         projectId1.setId(1); 
  12.         list.add(projectId1); 
  13.  
  14.         DeviceModel device2 = new DeviceModel(); 
  15.         device2.setNo("1"); 
  16.         ProjectId projectId2 = new ProjectId(); 
  17.         projectId2.setDeviceModel(device2); 
  18.         projectId2.setId(1); 
  19.         list.add(projectId2); 
  20.  
  21.         DeviceModel device3 = new DeviceModel(); 
  22.         device3.setNo("2"); 
  23.         ProjectId projectId3 = new ProjectId(); 
  24.         projectId3.setDeviceModel(device3); 
  25.         projectId3.setId(2); 
  26.         list.add(projectId3); 
  27.          
  28.        List<DeviceModel> models =  list.stream().map(ProjectId::getDeviceModel).distinct().collect(Collectors.toList()); 
  29.        System.out.println(models); 
  30.  
  31.     } 

先構建了一組數據,然后讓device1與device2的no屬性一樣,重寫了equals方法,理論上它們應該是相等的,device3對象用來做對照。

執行上面的程序,控制臺打印如下:

  1. [1, 1, 2] 

的確還原了大佬的bug,也奇怪為什么會這樣。但既然bug已重現,解決就是比較簡單的事了。

此時,大佬又發來另外一個線索,說通過for循環形式沒事:

  1. List<DeviceModel> results = new ArrayList<>(); 
  2. for (DeviceModel deviceModel : list.stream().map(ProjectId::getDeviceModel).collect(Collectors.toList())) { 
  3.     if (!results.contains(deviceModel)) { 
  4.         results.add(deviceModel); 
  5.     } 
  6. System.out.println(results); 

這種實現形式恰好又可以用來做對照。

問題排查

進行問題排查時首先也想到了debug,但是同樣出現并未走equals方法的情況。

仔細看了一下代碼,發現在Stream處理的過程中用到了map操作。而在之前的文章中也提到,Map中判斷一個對象是否已經存在是先通過key的hash值定位到對應的數組下標,如果該位置上的Entry沒有值,則直接保存;如果已經有存在的值,再通過equals方法比較值是否一樣。

那么,是不是因為重寫了equals方法,而沒有重寫hashcode方法導致的呢?于是,在DeviceModel類中新增了hashcode方法:

  1. @Override 
  2. public int hashCode() { 
  3.     // JDK7新增的Objects工具類 
  4.     return Objects.hash(no); 

再次執行,測試方法,發現可以成功去重了。很顯然,大佬的失誤是在重寫equals方法時違背了一條原則:如果一個類的equals方法相等,那么它們的hashcode方法必須相等。由于沒有重寫hashcode方法導致違背這一原則。因此,在隱式使用Map時就出現了莫名其妙的問題。

后續

經過這一番周折,問題終于解決。想必大家更也更加明白了為什么重寫equals方法一定要重寫hashcode方法了。后面大佬又考問我一個問題:為什么list.contains方法不會出現這個問題呢?

因為List的底層結構是數組,不像Map那樣為了提升效率先對Key進行hash處理比較。簡單看一下ArrayList中contains方法的核心實現:

  1. public int indexOf(Object o) { 
  2.     if (o == null) { 
  3.         for (int i = 0; i < size; i++) 
  4.             if (elementData[i]==null
  5.                 return i; 
  6.     } else { 
  7.         for (int i = 0; i < size; i++) 
  8.             if (o.equals(elementData[i])) 
  9.                 return i; 
  10.     } 
  11.     return -1; 

可以看出如果對象不為null時,還是循環調用的equals方法來處理的。

小結

通過本篇文章講了一個幫大佬定位問題的故事,感謝大佬給我一個很好的寫作素材,這期間有很多值得學習和借鑒的內容。從側面也證明,有些面試題的確有它的價值,如果你以為只是在造飛機,真有可能是在實踐中沒遇跳到坑里到而已。

最后,大佬就是因為沒好好看公眾號的上篇文章,才掉坑里的[捂臉][捂臉][捂臉]。所以,間接說明本公眾號的內容對大家還是能提供一些幫助的,感興趣就關注一下。也歡迎直接加微信好友,探討一些有意思的技術問題。

 

責任編輯:武曉燕 來源: 程序新視界
相關推薦

2023-03-10 08:27:07

for循環項目線性結構

2021-07-28 05:01:29

Lombok前端測試

2021-04-30 08:21:22

Linux管道設計

2021-10-07 16:45:06

MySQL數據庫

2021-01-30 09:50:54

MySQL密碼服務器

2021-01-05 22:49:37

Python編程語言Java

2020-02-03 09:10:23

數據庫刪庫刪庫跑路

2024-01-04 14:16:05

騰訊紅黑樹Socket

2022-10-25 17:53:09

Java線程池

2019-07-29 14:38:35

服務器開發工具

2021-01-08 09:36:23

程序員比特幣黑客

2020-10-26 08:56:32

技術總監程序員

2021-04-15 21:55:38

電腦磁盤微軟

2018-01-18 22:26:30

2024-04-18 08:00:23

openInula?React響應式 API

2024-05-13 07:58:52

開源項目PR

2021-05-11 16:20:02

網站HTTPHTTPS

2021-06-21 07:44:07

程序員面試職場

2016-10-17 19:14:28

2022-09-27 18:19:32

Java數據結構
點贊
收藏

51CTO技術棧公眾號

日韩在线观看你懂的| 中文字幕一区二区三区四区不卡| 国产精品高清亚洲| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 亚洲激情成人网| 欧美视频免费播放| 美女免费久久| 粉嫩aⅴ一区二区三区四区| 51ⅴ精品国产91久久久久久| 国产黄色大片免费看| 99久久999| 欧美性生交xxxxx久久久| 性欧美精品一区二区三区在线播放| av一区二区三| 玖玖在线精品| 欧美精品九九久久| 日本精品久久久久中文| 国产精东传媒成人av电影| 欧美亚洲一区二区在线| 中文字幕中文字幕一区三区| 特黄视频在线观看| 天堂美国久久| 日韩av资源在线播放| 超碰超碰在线观看| 三级中文字幕在线观看| 日韩美女啊v在线免费观看| 国产成人精品综合久久久| 国模无码国产精品视频| 国产一区二区三区日韩精品 | 亚洲国产www| 日本大胆欧美| 亚洲激情小视频| 国产毛片久久久久久| 91久久国产综合久久91猫猫| 亚洲一二三区视频在线观看| 正在播放一区| 国产区高清在线| 不卡视频一二三| 51精品国产人成在线观看| 中文字幕网址在线| 久久国产福利| 国产91精品久久久| 日韩三级视频在线| 激情亚洲成人| 欧美大胆在线视频| av最新在线观看| 青青一区二区三区| 日日骚av一区| 久久中文字幕精品| 欧美精品尤物在线观看| 亚洲人a成www在线影院| 少妇精品一区二区| 豆花视频一区二区| 精品久久国产97色综合| 日批视频免费看| 狂野欧美xxxx韩国少妇| 51精品秘密在线观看| 色噜噜狠狠一区二区| 国产精品久久久久久妇女| 色综合天天综合网天天看片| 男人揉女人奶房视频60分| 鲁鲁在线中文| 岛国av一区二区在线在线观看| 成年人网站国产| √最新版天堂资源网在线| 亚洲地区一二三色| 日本网站免费在线观看| 亚洲精品中文字幕| 疯狂做受xxxx高潮欧美日本| 欧美牲交a欧美牲交aⅴ免费下载| 免费福利视频一区二区三区| 色婷婷av一区二区三区软件 | 精品剧情v国产在线观看在线| 99热这里只有精品2| 日韩中文字幕在线一区| 精品久久久久久亚洲综合网| 久草视频福利在线| 亚洲第一论坛sis| 一区二区国产精品视频| 亚洲欧美另类日本| 国产精品videosex极品| 国内精品久久久久久中文字幕 | 色综合久久88色综合天天| 99免费视频观看| 色婷婷成人网| 精品国产露脸精彩对白| 法国空姐电影在线观看| 久久国产成人精品| 欧美激情视频一区二区三区不卡| 日韩精品在线免费看| 老司机午夜精品视频在线观看| 国产精品一区二区三区免费视频| 国产欧美日韩成人| 97aⅴ精品视频一二三区| 性欧美videosex高清少妇| 性欧美videoshd高清| 99免费精品在线| 欧美精品亚洲| h片在线观看网站| 国产日韩三级在线| 狠狠色综合欧美激情| 黄色国产在线| 一区二区三区美女视频| 久久精品香蕉视频| tube8在线hd| 欧美系列在线观看| 日本精品一二三区| 成人激情视频| 韩国国内大量揄拍精品视频| 在线观看日批视频| 99国产精品一区| 老司机av福利| 日韩av大片站长工具| 欧美一级黄色片| 国产一伦一伦一伦| 奇米影视777在线欧美电影观看| 伊人成人开心激情综合网| 久久免费公开视频| 久久99久久99精品免视看婷婷| 精品国产一区二区三区四区vr| 麻豆影视在线观看_| 欧美日韩精品在线视频| 免费黄色在线播放| 日韩国产一区二区三区| 国产91精品高潮白浆喷水| 99久久久久久久| 中文字幕不卡的av| 欧美一级黄色片视频| 99精品在免费线中文字幕网站一区| 自拍偷拍亚洲精品| 无码人妻丰满熟妇精品| 成人激情动漫在线观看| 在线观看三级网站| 欧美性www| 国产一区二区三区直播精品电影| 性无码专区无码| 成人永久看片免费视频天堂| 日韩视频在线观看视频| 成人做爰视频www| 欧美色国产精品| 国产一级二级在线观看| 亚洲第一区色| 国产91视觉| 亚洲欧美日韩成人在线| 亚洲一二三级电影| 国产成人精品一区二区在线小狼| 天天射综合网视频| 成人乱色短篇合集| 看女生喷水的网站在线观看| 欧美丝袜丝nylons| 国产在线综合视频| 视频一区视频二区在线观看| 欧美成人在线免费观看| 日本黄色免费在线| 日韩国产精品视频| 国产真实的和子乱拍在线观看| 国产成人自拍高清视频在线免费播放| 国产伦精品一区二区三区高清版| www视频在线免费观看| 在线成人小视频| 亚洲成人激情小说| 欧美激情综合色综合啪啪| 亚洲在线第一页| 欧美性猛片xxxxx免费中国| 日韩精品一区二区三区四区| 精品无码久久久久| 99久久婷婷国产综合精品| 自慰无码一区二区三区| 伊人春色精品| 国产裸体写真av一区二区 | 大胆欧美人体视频| 国产高清在线免费| 亚洲一区免费在线观看| 性囗交免费视频观看| 午夜亚洲视频| 91九色综合久久| 2020国产在线视频| 亚洲精品在线电影| 69国产精品视频免费观看| 激情国产一区二区| 成人区一区二区| 日韩精品欧美大片| 国产精品日日做人人爱| 日韩一级片免费看| 91九色最新地址| 欧美一级片在线视频| 成人听书哪个软件好| 99热成人精品热久久66| 99久久精品网| 国产视色精品亚洲一区二区| 日韩三区在线| 久久av中文字幕| 秋霞av在线| 91精品国产麻豆国产自产在线 | yourporn在线观看视频| 日韩一区二区三区av| 日韩 欧美 中文| 成人一区二区三区视频在线观看| 免费看又黄又无码的网站| 色综合色综合| 久久99精品久久久久久青青日本| 国产精品原创视频| 久久久久久久久久婷婷| 91精品专区| 亚洲韩国日本中文字幕| 91亚洲精品国偷拍自产在线观看 | 一区二区av在线| 亚洲免费成人网| 欧美日韩一区二区三区在线看| 国产第一页在线播放| 国产精品久久久久久久久果冻传媒| 99热超碰在线| 国内精品不卡在线| 成人精品小视频| 亚洲福利专区| 强开小嫩苞一区二区三区网站| 网曝91综合精品门事件在线| 亚洲一区亚洲二区| 成人免费在线观看视频| 91高清免费在线观看| 羞羞网站在线免费观看| 日韩在线观看免费高清| 国产成人精品一区二区色戒| 亚洲成av人片| 欧美成人黄色网| 中文字幕中文乱码欧美一区二区 | 99热这里只有精品66| 色综合久久88色综合天天免费| 久久免费少妇高潮99精品| 中文字幕一区二区三区蜜月| 黄色aaa视频| www.亚洲人| 亚洲欧美综合视频| 国产成人av一区二区三区在线| 天堂中文av在线| 三级欧美在线一区| 99色精品视频| 亚洲一区二区毛片| 欧美日本视频在线观看| 激情综合视频| a级免费在线观看| 黄色成人在线网站| 大胆欧美熟妇xx| 欧美区一区二| 国产一区 在线播放| 午夜精品亚洲| 五月天激情图片| 日本亚洲不卡| 好吊妞www.84com只有这里才有精品 | 中文不卡在线| 麻豆一区二区三区在线观看| 99久精品视频在线观看视频| 一区二区在线高清视频| 91欧美日韩| 波多野结衣久草一区| 国产精品视频一区二区三区| 97免费中文视频在线观看| 久久www人成免费看片中文| 欧美精品久久久久久久久久| 麻豆福利在线观看| 97久久精品国产| 伊人久久视频| 国产精品美乳在线观看| 激情欧美一区二区三区黑长吊| 国产日韩欧美夫妻视频在线观看| 999久久久国产999久久久| 91九色视频在线观看| 亚洲一区二区三区中文字幕在线观看 | 经典三级久久| 国产精品区一区二区三在线播放 | 精品无人区太爽高潮在线播放 | 7777精品伊人久久久大香线蕉最新版| 一级久久久久久久| 欧美一区二区日韩一区二区| 性生活视频软件| 亚洲国产中文字幕久久网| 国产三级视频在线播放线观看| 日韩最新中文字幕电影免费看| 制服丝袜中文字幕在线| 91av国产在线| 日本免费在线一区| 国产精品一区二区三区精品| 九九热线有精品视频99| 在线国产99| 亚洲人www| 中文字幕视频在线免费观看| 国产精品一区久久久久| 免费无码av片在线观看| 免费看黄色91| 欧美日韩国产精品激情在线播放| 日韩国产精品大片| 久久黄色一级视频| 久久久久久综合| 永久久久久久久| 日韩欧美在线观看| 国产毛片在线视频| 日韩毛片中文字幕| av中文字幕在线播放| 奇米一区二区三区四区久久| 电影中文字幕一区二区| 麻豆av一区二区三区| 亚洲国产精品成人| 日韩亚洲在线视频| 成熟亚洲日本毛茸茸凸凹| 成人黄色a级片| 亚洲成av人片一区二区| 国产欧美久久久| 伊人久久久久久久久久| xxx在线免费观看| 91精品国产自产在线| 亚洲精品aaaaa| 久久久久久久香蕉| 美女视频一区二区三区| 亚洲av无码国产精品久久| 一区二区三区色| 91久久精品无码一区二区| 亚洲女成人图区| 国产精品69xx| 91精品综合久久| 天天做天天爱天天综合网2021 | 国产精品国产三级国产传播| 色婷婷综合久久久中文一区二区| 亚洲h视频在线观看| 俺也去精品视频在线观看| av有声小说一区二区三区| 国产一区二区在线观看免费播放| 中文字幕日韩欧美精品高清在线| 91人人澡人人爽人人精品| 久久美女艺术照精彩视频福利播放 | 97在线视频免费| 88久久精品| 黄色一级片av| 国产美女在线精品| 亚洲女人久久久| 欧美日韩小视频| 91网页在线观看| 国产精品video| 欧美日韩久久精品| 青青草av网站| 久久久噜噜噜久久中文字幕色伊伊| 日本三级中文字幕| 精品播放一区二区| wwww亚洲| 精品欧美一区二区在线观看视频| 亚洲一级电影| youjizz.com日本| 亚洲第一福利一区| 午夜福利理论片在线观看| 668精品在线视频| 亚洲区小说区图片区qvod| 无码无遮挡又大又爽又黄的视频| 91在线精品一区二区| 亚洲欧美偷拍一区| 在线观看中文字幕亚洲| 国产精品原创视频| 欧美a级黄色大片| 成人午夜视频在线观看| 久久精品国产av一区二区三区| 亚洲电影免费观看高清完整版在线 | 久久久久成人网| 欧美亚洲tv| 最近免费中文字幕中文高清百度| 国产丝袜美腿一区二区三区| 中文字幕激情视频| 久久久精品亚洲| 99这里只有精品视频| 免费无码不卡视频在线观看| 久久综合久久综合亚洲| 中文字幕一区二区人妻| 久色乳综合思思在线视频| 波多野结衣欧美| 黄在线观看网站| 中文字幕亚洲精品在线观看| 精品久久久中文字幕人妻| 97人洗澡人人免费公开视频碰碰碰| 性欧美xxxx免费岛国不卡电影| 韩国中文字幕av| 亚洲免费观看高清完整版在线 | 欧美一区二区激情视频| 亚洲色图17p| www999久久| 免费欧美一级视频| 国产精品国产自产拍在线| 午夜精品一二三区| 国产91久久婷婷一区二区| 99久久夜色精品国产亚洲狼 | 999精品视频在这里| 日韩在线视频在线观看| 中文字幕在线免费不卡| 国产成人手机在线| 国产精品69久久| 欧美日韩18| 欧美人妻一区二区三区| 日韩一级片网站| 电影亚洲精品噜噜在线观看| 国产精品视频网站在线观看| 国产午夜精品在线观看| 成人av免费播放| 国产精品久久久久久网站| 欧美涩涩网站|