欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

List集合中数据用set集合去重复,用set集合去重复数据重写了equals还是没成功!

程序员文章站 2022-03-07 10:49:18
...

【用set集合去重复数据,重写equals还是不成功的问题解决思路在文章最后】

需求描述:

因业务需要,通过复杂的代码逻辑从数据库取出数据放入List集合中,涉及多次从访问数据库取出数据放入List集合中,其中会取到相同的数据放入集合,这需要去除这部分重复数据才能将业务继续进行下去;

处理方法:

用set集合来去重;

实现思路:

首先需要重写实体类对象的equals方法,和hashCode方法,然后将List集合中的数据加入set集合中实现数据去重复;

1.重写实体类的equals方法

重写equals方法中需要用哪些字段来判断集合中的数据是否重复? 经过一番考虑之后,决定用一个id字段,因为id自增主键在数据库中是唯一的,如果数据重复它们的id肯定是一致的;

@Override
    public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Teacher other = (Teacher) obj;
        if (id != other.id)
            return false;
        return true;
    }

 2.重写实体类的ashCode方法 只写id的就可以了或直接返回1; 

 @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + (int) (id ^ (id >>> 32));
        return result;
    }

或

@Override
    public int hashCode()
    {
        return 1;
    }

去重复具体代码:

List<Teacher> teacherList = null;

Set<Teacher> teacherSet = new HashSet<Teacher>();

FieldSelector[] selectors = new FieldSelector[2];
        selectors[0] = new FieldSelector();
        selectors[0].setFieldName("fundClaimId");
        selectors[0].setOperator("contains");
        selectors[0].setValue(id);
        selectors[1] = new FieldSelector();
        selectors[1].setFieldName("fundStatus");
        selectors[1].setOperator("!=");
        selectors[1].setValue(PiConstant.PROCEDUREFEE_FUND_STATUS_RETURN);

      // 通过资金认领id查询老师表数据
        teacherList = teachersService.queryTeachers(CALLER,
                selectors, 0, Integer.MAX_VALUE);   

             if (null != teacherList
                                && 0 < teacher.size())
                        {

                              //加入set集合去重                           

                                teacherSet.addAll(teacherList);

                        }

                 // 教师表数据
                    if (null != teacherSet && 0 < teacherSet.size())
                    {

                        for (teacher re : teacherSet)
                        {
                            //打印出去重后的数据
                            system.out.println(re.toString());
        
                        }

                    }

出现重写equals用set集合去重复不成功问题:

这个问题一般是因为只重写了equals方法而没重写hashCode方法导致的,所以只要加一个hashCode方法就OK了;

因为在数据中先判断哈希值是否相同,后才会去判断equals的值,所以实体类对象中的hashCode必须重写;

科补hashCode() 方法工作原理

简单地说,hashCode() 方法通过哈希算法生成一个整数值。 
相同的对象(通过equals方法判断)返回相同哈希值。

hashCode()方法的算法约定为:

  • 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

  • 两个相对的对象(通过equals方法判断)必须返回相同哈希值。

  • 两个不相对的对象(通过equals方法判断),调用hashCode()方法返回值不是必须不相等。但开发者需了解,不同对象返回不同的哈希值会提升效率。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

工具自动生成equals方法和hashCode():

在实体类中鼠标右键点击Source

List集合中数据用set集合去重复,用set集合去重复数据重写了equals还是没成功!