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("jie");
System.out.println(names.contains("jie"));
分析:由源码可知此时输入的o不为null,则执行下面代码,此时输入的字符串与数组中的元素一样,则判断为ture.
包装类:
ArrayList<Integer> ages = new ArrayList<Integer>();
ages.add(18);
System.out.println(ages.contains(18));
分析:同上,输入的o不为null,则执行下面代码,这时源码中的equals方法是调用Integer中的equals方法,即
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
这时比较的是值是否相等。
自定义类类型:
ArrayList<Student> students = new ArrayList<Student>();
students.add(new Student("111"));
System.out.println(students.contains(new Student("111")));
在重写equals方法之前,由于Student类中无equals方法,因此调用的是Object中equals方法,此equals方法是比较地址是否相同,而此例中地址不同,因此输出false.
重写方法后,即再Student类加上
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);
}
}
此时在执行equals方法时会调用重写的equals方法,即比较内容是否相同。
但此时存在一些问题,如:
ArrayList<Object> list = new ArrayList<Object>();
list.add(new String("111"));
System.out.println(list.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.