源码:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
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("Tom");//向ArrayList集合中添加元素
System.out.println(names.contains("Tom"));//判断集合中是否包含Tom元素,若有则为true,否则false
分析:
contains方法执行时,会调用indexOf()方法,在indexOf方法中会判断传入的String类的上转型对象o是否为空,如果为空,返回下表值;若o非空,则进行遍历元素,contains方法实质上调用的是String对象中的equals 方法。
包装类:
ArrayList<Integer> ages = new ArrayList<Integer>();
ages.add(12);
System.out.println(ages.contains(new Integer(12)));
分析:
contains方法执行时,会调用indexOf()方法,进行初步判断,o非空则会调用包装类Integer中的equals方法。
自定义类:
ArrayList<Student> students = new ArrayList<Student>();
students.add(new Student("111"));
System.out.println(students.contains(new Student("111")));
public class Student {
private String id;
public Student(String id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
Student s=(Student) obj;
return this.id.equals(s.id);
}
}
分析:
重写前:Student类中无equals方法,因此调用的是Object中equals方法,比较两者的地址是否相同,而此例中地址不同,所以结果为false。
重写后:此时在执行equals方法时会调用重写的equals方法,即比较内容是否相同,所以输出结果为true。
ArrayList<Object> students = new ArrayList<Object>();
students.add(new String("111"));
System.out.println(students.contains(new Student("111")));
此时String类无法转为Student类,会报错,则需要使用instanceof修改重写的equals方法:
@Override
public boolean equals(Object obj) {
if(obj instanceof Student) {
Student s = (Student)obj;
return this.id.equals(s.id);
}
return false;
}
obj是Student类才进行下转型比较,否则返回false.