當前位置:首頁 > IT技術 > 其他 > 正文

關于ArrayList 中子方法 -- contains 疑惑解決
2022-05-31 17:19:29


寫之前先看下 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了????

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

?

跟進去發(fā)現他是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 的方法,這個設計到面向對象了!

?

?

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

 

  -----年年花相似? 歲歲人不同-----


作者:??咸瑜???


本文摘自 :https://blog.51cto.com/u

開通會員,享受整站包年服務立即開通 >