详述ArryList类中是contains方法
源码
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> list = new ArrayList<String>();
list.add("Jim");
System.out.println(list.contains("Jim"));
分析:list集合中存储的是String类型的数据,调用contains()方法,然后调用indexOf(),因为传递的值不为空,所以走else代码部分,然后调用String类型的equals方法,比较的是字符串是否相等
包装类
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(12);
System.out.println(list.contains(12));
分析:此时list集合中存储的是int类型的封装类,调用Interger类型的equals方法,比较的是值是否相等
自定义类
自定义一个学生类
public class Student {
private String id;
public Student(String id) {
super();
id = id;
}
public String getid() {
return id;
}
public void setid(String id) {
id = id;
}
}
添加学生
ArrayList<Student> list = new ArrayList<Student>();
list.add(new Student("12"));
System.out.println(list.contains(new Student("12")));
分析:
- 重写equals方法前:此时list集合中存储的是Student类型的自定义数据,调用contains()方法,然后调用indexOf(),因为传递的值不为空,所以走else代码部分,然后调用的是Object里的equals方法,比较的是地址是否相等
- 重写equals方法后:调用的是自定义的equals方法
instanceof@Override public boolean equals(Object obj) { if (obj instanceof Student) { Student student = (Student) obj; return this.id.equals(student.id); } return false; }
分析:此时list中可以放String类型的数据,也可以放Student类型数据,当执行到equals方法时无法将String类型的数据强转成Student类型的数据,所以重写的equals方法中强转之前先判断是否是Student数据类型,若不是Student类型则可以直接返回falseArrayList<Object> list = new ArrayList<Object>(); list.add(new String("12")); System.out.println(list.contains(new Student("12")));