我们先看下contains()的源码-JDK1.8
public boolean contains(Object o) {
return this.indexOf(o) >= 0;
}
public int indexOf(Object o) {
return this.indexOfRange(o, 0, this.size);
}
int indexOfRange(Object o, int start, int end) {
Object[] es = this.elementData;
int i;
if (o == null) {
for(i = start; i < end; ++i) {
if (es[i] == null) {
return i;
}
}
} else {
for(i = start; i < end; ++i) {
if (o.equals(es[i])) {
return i;
}
}
}
return -1;
}
从源码可知,list.contains(obj)的返回值取决于obj对象的equals()方法。
若obj未重写Object的equals()方法,则list.contains(obj)是在list中查找是否有和obj相同引用的对象。若有,则返回true;否则,返回false。
否则,则在list中查找是否有和obj等价的对象。若有,则返回true;否则,则返回false。
现有一个Person类,未重写equals()方法
public class Person {
private int id;
private String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
ArrayList<Person> list2 = new ArrayList();
Person person1 = new Person(1, "Lisa");
Person person2 = new Person(1, "Lisa");
list2.add(person1);
System.out.println(list2.contains(person2));
}
}
false
String重写了Object的equals()方法
public static void main(String[] args) {
ArrayList<String> list = new ArrayList();
String str1 = new String("ddd");
String str2 = new String("ddd");
list.add(str1);
System.out.println(list.contains(str2));
}
true