写之前先看下 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 的方法,这个设计到面向对象了!
谢谢大家看到这里 希望能帮到小白和疑惑人群,谢谢!
-----年年花相似 岁岁人不同-----
作者:咸瑜