源码
- contains:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
- 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;
}
String类型
源码:
ArrayList<String> names = new ArrayList<String>();
names.add("Jim");
System.out.println(names.contains("Jim"));
分析:
创建集合names并增加元素Jim,用contains方法将元素Jim上传为object对象,然后调用indexOf方法对该对象进行判断。当该对象不为null时,将该对象与集合names中的元素进行比对。若相同,则返回true;反之则返回false。其实质为调用String对象中的equals函数。
包装类
源码:
ArrayList<Integer> ages = new ArrayList<Integer>();
ages.add(12);
System.out.println(ages.contains(new Integer(12)));
分析:
创建集合ages并增加元素12,用contains方法将元素12上传为object对象,然后调用indexOf方法对该对象进行判断。当该对象不为null时,将该对象与集合names中的元素进行比对。若相同,则返回true;反之则返回false。其实质为调用包装类对象中的equals函数。
自定义类类型
源码:
ArrayList<Student> students = new ArrayList<Student>();
students.add(new Student("111"));
System.out.println(students.contains(new Student("111")));
分析:
- 重写前:
public boolean equals(Object obj) {
return (this == obj);
}
Object obj会调用equals函数而student中并没有equals函数,只能向上溯调用父类object中的equals方法从而出错
- 重写后:
public boolean equals(Object obj) {
Student s = (Student) obj;
String argId = this.id;
String elementId = s.id;
return argId.equals(elementId);
}
重写了equals函数并进行了强制类型转换,所以代码能够正常运行
instanceof
源码:
ArrayList<Object> list = new ArrayList<Object>();
list.add(new Student("111"));
System.out.println(list.contains(new Student("111")));
分析:
用instanceof函数进行判断该对象能否转为下转型对象。若无法实现下转型,则返回false