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

【用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_无往而不胜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值