寫之前先看下 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 的方法,這個設計到面向對象了!
?
?
謝謝大家看到這里 希望能幫到小白和疑惑人群,謝謝!
-----年年花相似? 歲歲人不同-----
作者:??咸瑜???