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

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