AndroidJava List与equals的微妙关系,小心掉坑里
前言
List 有多個實現,本文以ArrayList(LinkedList也一樣)作為說明,equals是Object的一個成員函數,例子中的bean重寫實現它。
一、Bean 類定義并重寫equals函數
public class Book {private String id;private String name;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic boolean equals(Object obj) {//這里重寫if (obj instanceof Book) {//obj是book對象,使用當前對象id與obj的id進行對比return id == null ? false : id.equals(((Book) obj).id);} else if (obj instanceof String) {//目的可以接受id進來匹配是不是同一本書(我們得到id,不需要構造一個book對象來進行匹配對比)return obj.equals(id);}return false;} }二、equals的演練
book1 equals book2 ? false
book2作為參數,book1對象調用equals函數,id不一樣,結果自然是false。
book1 equals String ? true
字符串"111"作為參數,book1對象調用equals函數,結果是true。這也符合我們重寫equals的目的。
List演練
我們知道,list中包含某個對象,是通過遍歷list的每一個元素和給定的對象相匹配,如果匹配上說明包含,反之不包含,且匹配也是調用equals函數。
看如下代碼:
執行結果:
list contains book1 ? true
list contains id 111 ? false
結果不是我們期望的,前面已經驗證 book1.equals(“111”)的結果是true,list.contains(“111”)的結果是false。
不急,來看看ArrayList的contains實現(contains實際上是調用了indexOf函數):
for (int i = 0; i < size; i++)確實是遍歷了所有元素。問題在于if (o.equals(elementData[i]))
這里調用的是參數對象的equals,不是調用元素對象的equals函數。如果反過來if (elementData[i].equals(o))那么我們上面的結果就是true。
通俗的講,list.contains(“111”),contains函數中匹配時,是"111".equals(elementData[i]),不再是book.equals(“111”)。
總體來說,我們有重新實現equals的情況下,在使用list的時候要避免使用非本類的對象匹配方式,一定要同類如:list.contains(book1)。上面的情況請用111 構造出一個Book對象才能得到正確的結果。當然,list的indexOf也是如此。
那么代碼上為什么有這樣的坑呢,應該為了代碼簡練,如果寫成elementData[i].equals(o)的話,elementData[i]需要進行判空。
有知道更多原因的請留言,抱拳謝過。
總結
以上是生活随笔為你收集整理的AndroidJava List与equals的微妙关系,小心掉坑里的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 生成信号文件,生成的代码如
- 下一篇: java读取pem格式私钥_openss