掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
今天中午正在帶著耳機遨游在代碼的世界里,被運營在群里@了,氣沖沖的反問我最近有刪生產(chǎn)的用戶數(shù)據(jù)的嗎?我肯定客氣的回答道沒有呀?生產(chǎn)的數(shù)據(jù)我怎么能隨隨便便可以刪除,這可是公司的紅線,再說了我也沒有數(shù)據(jù)庫的刪除權(quán)限啊,不過查詢權(quán)限還是有的。趕緊登上堡壘機,然后去生產(chǎn)數(shù)據(jù)庫查一下數(shù)據(jù),查了一下數(shù)據(jù)是還在的,嚇?biāo)懒?,?shù)據(jù)還在問題就不大了,無非就是應(yīng)用程序出問題了,趕緊打開代碼查看下,為什么會少了一條用戶數(shù)據(jù),看了下代碼貌似沒啥問題就是比較簡單的一個邏輯,直接從DB通過分頁查詢數(shù)據(jù)給到前端,然后前端負責(zé)展示,沒有啥復(fù)雜的邏輯。心想肯定是前端的問題,肯定是他少展示了數(shù)據(jù),立馬把問題也甩給了他,讓他幫忙配合一起看看是否是前端的問題,然后自己也仔細看看代碼,不到一分鐘前端說他展示的數(shù)據(jù)沒有問題,都是后端給到的,沒有漏掉展示的。那就是后端的bug了羅。肉眼望去覺得可能出問題的就是分頁導(dǎo)致的數(shù)據(jù)丟了。不過這個分頁插件是全公司都在用,應(yīng)該不至于出問題吧,找不到問題只能讓測試幫忙在測試環(huán)境試試,看看是否可以復(fù)現(xiàn)。

仔細看了一眼,居然有個去重的方法,去重邏輯也比較簡單就是把list通過轉(zhuǎn)為set去下重,看下來應(yīng)該就是這個去重方法有問題了 大致寫了單元測試模仿了下生產(chǎn)的數(shù)據(jù),大致邏輯如下:
- public static void main(String[] args) {
- Set
userSet = new HashSet<>(); - UserDTO userDTO = new UserDTO();
- userDTO.setId(1);
- userDTO.setUserName("java金融");
- UserDTO userDTO1 = new UserDTO();
- userDTO1.setId(2);
- userDTO1.setUserName("java金融");
- userSet.add(userDTO);
- userSet.add(userDTO1);
- System.out.println(userSet.size());
- System.out.println(userDTO1.equals(userDTO));
- }
- @Data
- static class UserDTO extends BaseDTO {
- private String userName;
- }
- @Data
- static class BaseDTO {
- private Integer id;
- }
我們可以輸出結(jié)果set集合的長度是1,user1和user2 是相等的,明明兩個user的ID是不一樣的,為何會相等,我們知道set可以去重 是因為Set的操作,都是通過操作map來實現(xiàn)的,set的add其實就是調(diào)用map的put方法,map的put方法我相信大家應(yīng)該都去看過其源碼,這里就不詳細再說了,大概流程就是通過key通過hash算法定位到數(shù)組的下標(biāo),先判斷key的hash是否相等,如果相等再去判斷key的value相等,如果都相等就會覆蓋原來的值。我們上面這個例子就是對象的hash和value都相等導(dǎo)致,但是我們的兩個對象user1和user2 應(yīng)該是不等的,因為ID不等,那為什么會相等列?我們仔細看下上面的代碼,我們使用了lombok里面@Data注解,我們可以看看這個注解幫我們生成了哪些方法
通過上面的對比我們可以看出@Data注解幫我們生成了 注在類上,提供類的get、set、equals、hashCode、canEqual、toString方法,這個注解確實比較方便。上面那個bug 就是因為它生成的equals方法有問題,我們可以把上述代碼編譯下,然后把class 里面生成的equals方法拷貝出來看看
通過上述生成的代碼我們可以看出equals方法只比較了userName這個字段,也就是當(dāng)前類的字段,并沒有去比較父類的字段,這就是導(dǎo)致兩個對象相等的原因,我們既然找到問題了,那解決問題就比較簡單。
圖片差異點還是很明顯的,加入了@EqualsAndHashCode(callSuper = true) 會去調(diào)用父類的equals方法比較,所以這個注解也能夠解決這個問題。
本文轉(zhuǎn)載自微信公眾號「 java金融」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系 java金融公眾號。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流