Java ArrayList contains()
方法 用于判断集合中是否存在某个元素。
语法
语法如下:public boolean contains(Object obj)
参数
- obj: 要检查的对象元素。
返回值
布尔类型,存在返回true,不存在返回false。
注意
判断是否存在的原理是使用equals()方法,如有必要需要重写对象的equals()方法。
内部实现
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;
}
我们看到,相等的判断使用的是equals()方法。这一点非常重要,需要理解,请看下面的代码帮助理解。
equals比较的是对象的地址(对于String类型,equals比较的是String的内容)。
例子1
先看一个简单的例子,对于字符串的比较,只比较内容。import java.util.ArrayList;
public class ArrayListExample1 {
public static void main(String[] args) {
//字符串类型
ArrayList<String> arrayList= new ArrayList<String>();
arrayList.add("a");
arrayList.add("b");
arrayList.add("c"); if (arrayList.contains("b")) { System.out.println("存在元素b"); }
}
}
输出:存在元素b
例子2
看一个是否存在对象的例子,没有重写equals()方法。
import java.util.ArrayList;
public class Test {
public static void main(String args[]) {
//没有重写equals例子
ArrayList<Person> arrayList= new ArrayList<Person>();
Person person_1 = new Person(1,"张三", "湖北");
Person person_2 = new Person(2,"李四", "湖南");
arrayList.add(person_1);
arrayList.add(person_2);
Person person_check = new Person(2,"李四", "湖南");
System.out.println(arrayList.contains(person_check));//返回false
}
}
class Person {
private Integer id;
private String name;
private String address;
public Person(Integer id, String name, String address) {
this.id = id;
this.name = name;
this.address = address;
}
}
输出:false
上面的例子中,虽然person_2 和person_check有相同的id,name,address,但是它们的地址不同,所以不包含,返回false。
现在,我们重写equals方法再看。参考Java如何重写equals和hashCode方法。
import java.util.ArrayList;
public class Test {
public static void main(String args[]) {
//没有重写equals例子
ArrayList<Person> arrayList= new ArrayList<Person>();
Person person_1 = new Person(1,"张三", "湖北");
Person person_2 = new Person(2,"李四", "湖南");
arrayList.add(person_1);
arrayList.add(person_2);
Person person_check = new Person(2,"李四", "湖南");
System.out.println(arrayList.contains(person_check));//返回true
}
}
class Person {
private Integer id;
private String name;
private String address;
public Person(Integer id, String name, String address) {
this.id = id;
this.name = name;
this.address = address;
}
@Override
public boolean equals(Object o) {
if(o == this)
return true;
if(!(o instanceof Person))
return false;
if (o instanceof Person) {
Person person = (Person)o;
return person.id.equals(id)
&& person.name.equals(name)
&& person.address.equals(address)
;
}
return false;
}
}
输出:true