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());
             }
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM