zoukankan      html  css  js  c++  java
  • 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());
                 }
            }
        }

  • 相关阅读:
    表空间_oracle
    linux_1_Wed May 15 10:18:56 CST 2019
    玩oracle vm virtualBox+mac电脑+isomini7centos
    字符串比较用equal以及==的区别
    送货地图中的数据库操作

    健康,有度
    qa角色记一次测试过程回溯
    jmeter计数器的使用
    jmeter解析response里的json对象和数组
  • 原文地址:https://www.cnblogs.com/huanghuanghui/p/9524810.html
Copyright © 2011-2022 走看看