如何判断ArrayList中是否存在某一个自定义对象
程序员文章站
2023-12-21 14:53:22
...
在开发中经常用到ArrayList,有时候需要判断ArrayList中,是否已经存在某一个自定义的实体对象,该如何判断呢?
ArrayList的Api文档中有这样一个方法:boolean contains(Object o),用来判断是否存在某一个Object。
我们先来看一下这个方法实现的具体源代码:
/**
* Returns <tt>true</tt> if this list contains the specified element.
* More formally, returns <tt>true</tt> if and only if this list contains
* at least one element <tt>e</tt> such that
* <tt>(o==null ? e==null : o.equals(e))</tt>.
*
* @param o element whose presence in this list is to be tested
* @return <tt>true</tt> if this list contains the specified element
*/
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
/**
* Returns the index of the first occurrence of the specified element
* in this list, or -1 if this list does not contain the element.
* More formally, returns the lowest index <tt>i</tt> such that
* <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>,
* or -1 if there is no such index.
*/
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;
}
代码比较好理解,如果我们需要判断的那个对象,也就是传入的参数Object o,没有重写equals()方法,就会调用继承自object类的equals()方法。Object中的equals()方法如下:
public boolean equals(Object obj) {
return (this == obj);
}
双等号“ == ”,对于基本数据类型,比较的是它们的值。
对于非基本类型,比较的是它们在内存中的存放地址,或者说是比较两个引用是否引用内存中的同一个对象。
由此我们可以看出,调用contains(Object o)方法时:
如果传入的Object没有重写equals()方法,则是判断ArrayList中是否存在同一个对象。
如果重写了equals()方法,结果就不同了。
好,现在回到我们的问题。举个栗子,有一个自定义的Student类:
public class Student implements Serializable{
private static final long serialVersionUID = 1L;
private String id;
private String name;
private Integer age;
public Student(String id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
}
有一个ArrayList:
List<Student> list = new ArrayList<Student>();
应该如何使用contains()方法来判断该list是否包含某个Student对象呢?
大多数情况下,我们的目的不是要判断list中,是否存在内存地址相同的同一个对象,我们的判断标准,是根据实际业务需求来决定的。
以这里的Student为例,如果Student的两个实例,id不一样,即使name和age相同,也认为是不同的。要实现这个需求,需要重写针对id这个属性的equals()方法。
@Override
public boolean equals(Object obj) {
if (this == obj){
return true;
}
if (obj == null){
return false;
}
if (getClass() != obj.getClass()){
return false;
}
Student student = (Student) obj;
if (student.getId() == null) {
return false;
}
if (id == null) {
if (student.getId() != null){
return false;
}
} else if (!id.equals(student.getId())){
return false;
}
return true;
}
注意不要遗漏了针对null这种情况的判断。
重写完equals()方法之后,我们测试一下:
public static void main(String[] args) {
List<Student> list = new ArrayList<Student>();
Student s1 = new Student("001", "乔峰", 18);
Student s2 = new Student("002", "郭靖", 17);
Student s3 = new Student("003", "周伯通", 16);
list.add(s1);
list.add(s2);
list.add(s3);
Student s4 = new Student("003", "老顽童", 16);
boolean b = list.contains(s4);
System.out.println(b); //true
Student s5 = new Student("004", "周伯通", 16);
boolean b2 = list.contains(s5);
System.out.println(b2); //false
}
测试OK,符合我们的预期。