欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

如何判断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&nbsp;?&nbsp;e==null&nbsp;:&nbsp;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&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;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,符合我们的预期。

相关标签: List contains()

上一篇:

下一篇: