今天在做金碟系统与我们系统的对接的时候需要做一个客户同步
在同步时,需要比较对象,对查询出的数据库的数据进行比较
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()); } } }