日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

AndroidJava List与equals的微妙关系,小心掉坑里

發布時間:2025/3/12 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的演練

  • Bean 對象 vs Bean對象
  • public static void main(String[] args) {Book book1 = new Book();book1.setId("111");book1.setName("語文");Book book2 = new Book();book2.setId("222");book2.setName("數學");println("book1 equals book2 ? " + book1.equals(book2)); }

    book1 equals book2 ? false

    book2作為參數,book1對象調用equals函數,id不一樣,結果自然是false。

  • Bean對象 vs String 對象
  • public static void main(String[] args) {String id = "111";Book book1 = new Book();book1.setId(id);book1.setName("語文");println("book1 equals String ? " + book1.equals("111")); }

    book1 equals String ? true

    字符串"111"作為參數,book1對象調用equals函數,結果是true。這也符合我們重寫equals的目的。

    List演練

    我們知道,list中包含某個對象,是通過遍歷list的每一個元素和給定的對象相匹配,如果匹配上說明包含,反之不包含,且匹配也是調用equals函數。
    看如下代碼:

    public static void main(String[] args) {String id = "111";Book book1 = new Book();book1.setId(id);book1.setName("語文");Book book2 = new Book();book2.setId("222");book2.setName("數學");ArrayList list = new ArrayList(2);list.add(book1);list.add(book2);println("list contains book1 ? " + list.contains(book1));println("list contains id 111 ? " + list.contains("111")); }

    執行結果:

    list contains book1 ? true
    list contains id 111 ? false

    結果不是我們期望的,前面已經驗證 book1.equals(“111”)的結果是true,list.contains(“111”)的結果是false。
    不急,來看看ArrayList的contains實現(contains實際上是調用了indexOf函數):

    public boolean contains(Object o) {return indexOf(o) >= 0;}/*** Returns the index of the first occurrence of the specified element* in this list, or -1 if this list does not contain the element.* More formally, returns the lowest index <tt>i</tt> such that* <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,* or -1 if there is no such index.*/public int indexOf(Object o) {if (o == null) {for (int i = 0; i < size; i++)if (elementData[i]==null)return i;} else {for (int i = 0; i < size; i++)//因為這個判斷用的是o.equals,所以不包含111if (o.equals(elementData[i]))return i;}return -1;}

    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的微妙关系,小心掉坑里的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲狼人社区 | 日日拍夜夜拍 | 亚洲乱码国产乱码精品精的特点 | 国内精品第一页 | 综合色小说 | 久久福利免费视频 | 国产成人小视频 | 日本不卡一区在线观看 | 一区二区三区精品视频在线观看 | 国产三级在线免费观看 | 广州毛片| 日日插夜夜爽 | 97人妻精品一区二区三区软件 | 精品伦精品一区二区三区视频密桃 | 五月婷婷综合在线 | 超碰国产一区二区三区 | 粉嫩av国产一区二区三区 | 91视频99 | 国产精品19乱码一区二区三区 | 色呦呦国产 | 欧美变态口味重另类 | 亚洲不卡中文字幕 | 日本成人午夜 | 99热这里有| 蜜桃av噜噜一区二区三区网址 | 99久久精品国产一区色 | 99这里有精品视频 | 亚洲成人一二三 | 日韩va中文 | 日韩三区视频 | 日韩 欧美 亚洲 国产 | www.狠狠操 | 日韩毛片免费观看 | 免费欧美一级视频 | 天天干天天舔天天操 | 后进极品美女白嫩翘臀 | 精品视频在线观看一区二区 | 国产精品久久久久久影视 | 波多野结衣爱爱 | 一区二区三区在线电影 | 亚洲一区在线免费 | 一区二区三区小视频 | 91福利在线视频 | a成人在线 | 日韩欧美视频一区二区三区 | 四虎新网址 | 免费看黄色网 | 国产精一区 | 国产精品99久久免费黑人人妻 | 欧美肉丝袜videos办公室 | 善良的女朋友在线观看 | 亚洲av第一成肉网 | 欧美一级片一区 | h小视频在线观看 | 国产露出视频 | 成人午夜毛片 | 榴莲视频黄色 | 欧美成人专区 | 亚洲第一女人av | 亚洲午夜激情视频 | 亚洲精选在线 | 99国产精品人妻噜啊噜 | 亚洲人视频在线观看 | 日本美女黄视频 | 成人久久在线 | 久久成年网 | 久久亚洲国产 | 91视频99| 亚洲国产高清在线 | 日韩欧美在线第一页 | 欧美打屁股 | 亚洲高清精品视频 | 91红桃视频 | 亚洲男人的天堂网 | 777精品久无码人妻蜜桃 | 亚洲视频在线视频 | 国产精品国语自产拍在线观看 | 亚洲欧美综合另类自拍 | 色老头在线视频 | 精品国产精品国产偷麻豆 | 蜜臀网在线 | 99re这里只有精品在线观看 | 天天拍夜夜爽 | 丁香激情综合 | 免费一级欧美片在线播放 | 欧美特黄aaa| 一本久道久久综合无码中文 | 亚洲国产精品网站 | 欧美成综合 | 久久青| 日朝毛片 | 在线香蕉 | 蜜臀精品一区二区三区 | a视频免费在线观看 | 国产成人久久婷婷精品流白浆 | 欧美日本在线 | 女同av网站 | 插插宗合网 | 一本久道久久 |