今天在做金碟系統與我們系統的對接的時候需要做一個客戶同步
在同步時,需要比較對象,對查詢出的數據庫的數據進行比較
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()); } } }