List集合中的对象比较,取出不同对象

今天在做金碟系统与我们系统的对接的时候需要做一个客户同步

在同步时,需要比较对象,对查询出的数据库的数据进行比较

for(int i=0;i<list2.size();i++){
            if(! list1.contains(list2.get(i))){
                //把对应的对象加入到返回的结果集List中去就可以了
                List l = new ArrayList();
                l.add(list2);
                System.out.println(l.toString());
             }
        }

但是返回值总是false,在网上看到答案:需要在entity中重写equals方法:

    ArrayList的contains方法
            java
今天在用ArrayList类的caontains方法是遇到了问题,我写了一个存放Student类的ArrayList  但在调用list.contains(user)时总是返回false。 去看了下ArrayList的源码,源码如下:
        Java代码
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;
        }
        [java] view plaincopy
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;
        }


        发现在contains方法会调用 o.equals(elementData[i])方法,其中elementData[i]是个object类的实例。也就是说我在调用list.contains(user)时实际上比较的是user.equals(object) 这当然会返回false。

        正确的方法,在Student类中改写equals方法。 改写的代码如下:
        Java代码
public boolean equals(Object obj) {
        if (obj instanceof Student) {
        Student u = (Student) obj;
        return this.name.equals(u.name)
        && this.id.equals(id);
        }
        return super.equals(obj);

将需要对比的数据写到equals方法中,没写进去不比较,其他字段不同contains还是返回true,像这样:

Entity:

public class Student {
    private Integer id;
    private String name;
    private Integer isBack;
// ......
    public boolean equals(Object obj) {   
        if (obj instanceof Student) {   
            Student u = (Student) obj;   
            return this.name.equals(u.name)   
                    && this.id.equals(id);   
        }   
        return super.equals(obj);
        }
}
    public static void main(String[] args) {
        List<Student> list1 = new ArrayList<Student>();
        
        Student s = new Student();
        s.setId(1);
        s.setName("1");
        list1.add(s);
        
        List<Student> list2 = new ArrayList<Student>();
        Student student2 = new Student();
        student2.setId(1);
        student2.setName("1");
        student2.setIsBack(1);
        list2.add(student2);
        
        Student student3 = new Student();
        student3.setId(1);
        student3.setName("22");
        student3.setIsBack(213123123);
        list2.add(student3);
        
        for(int i=0;i<list2.size();i++){
            if(! list1.contains(list2.get(i))){
                //把对应的对象加入到返回的结果集List中去就可以了
                List l = new ArrayList();
                l.add(list2);
                System.out.println(l.toString());
             }
        }
    }

 但是在重写equals方法的时候,如果一个值为null,就会报空指针异常,所以可以在重写equals方法的时候将equals改为 == 

public boolean equals(Object obj) {   
        if (obj instanceof Student) {   
            Student u = (Student) obj;   
            return this.name==(u.name)   
                    && this.id==(id);   
        }   
        return super.equals(obj);
        }

 执行效果:

public static void main(String[] args) {
        List<Student> list1 = new ArrayList<Student>();
        
        Student s = new Student();
        s.setId(1);
        s.setName("1");
        list1.add(s);
        
        List<Student> list2 = new ArrayList<Student>();
        Student student2 = new Student();
        student2.setId(1);
        student2.setIsBack(1);
        list2.add(student2);
        
        Student student3 = new Student();
        student3.setId(1);
        student3.setName("111");
        student3.setIsBack(213123123);
        list2.add(student3);
        
        for(int i=0;i<list2.size();i++){
            if(! list1.contains(list2.get(i))){
                //把对应的对象加入到返回的结果集List中去就可以了
                List l = new ArrayList();
                l.add(list2);
                System.out.println(l.toString());
             }
        }
    }

原文地址:https://www.cnblogs.com/huanghuanghui/p/9524810.html