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