關於ArrayList 中子方法 — contains 疑惑解決

  • 2021 年 4 月 17 日
  • 筆記

寫之前先看下 ArrayList 子函數 contains 的Api 怎麼介紹:

 

boolean contains(Object o)
          如果此列表中包含指定的元素,則返回 true

先看個字面意思過過眼就好了 哈哈哈

然之後 我們上實例見 問題:(詳看注釋)

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        List list = new ArrayList();
        Person person_sl = new Person("張三",10);    //Person類無重新寫equals
        list.add(person_sl);
        System.out.println(list.contains(person_sl));   //true
        System.out.println(list.contains( new Person("張三",10))); //false


        list.add("a");
        String str_a = new String("a");

        System.out.println(list.contains("a")); //true
        System.out.println(list.contains(str_a));   //true ??? 不是說好比的是地址嘛?
    }
}

哎 前頭比的是地址 怎麼後頭兩個地址不一樣的字符串都為true了????

別急:我們跟蹤進去看看:

 

跟進去發現他是ArrayList 重寫父接口的 那麼 看下他怎麼重寫的:

public boolean contains(Object o) {
return indexOf(o) >= 0;
}

一看! 哎! 好傢夥! 原來是用 indexof 來找的,那麼我們在跟蹤進去看看 他 indexof 是怎麼實現是:

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++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}

  好傢夥 這下明白了吧 :除了null之外  他都是用 equals 來判斷的:

  那麼就懂了:

  我前面已滿俠伏筆 說: 無重寫 equals ,所以啊 他默認比的是地址

  因為String類 它重寫了equals  無論如何 它比的都是 內容 ,這下真相大白了!

  所 你完全可以在自己類重寫任何object 的方法,這個設計到面向對象了!

 

 

  謝謝大家看到這裡 希望能幫到小白和疑惑人群,謝謝!

 

  —–年年花相似  歲歲人不同—–