1、问题
Java中如何使用集合Set对对象去重?
2、背景
最近使用Spring boot做服务端项目,需要对一个List<Object> 去重,属于入门级操作。
3、解决方案
1、使用 TreeSet :重写TreeSet的Comparator
Comparator<Object> comparator=new Comparator<Object>() {@Overridepublic int compare(Object obj1, Object obj2) {// 当两个id相等时及判断两个对象相等boolean equalStatus = obj1.getId().compareTo(obj2.getId());return equalStatus}// 使用comparator初始化TreeSetSet<Object> set = new TreeSet<Object>(comparator);
2、使用 HashSet :重写Entity的 hashCode() 和 equals() 函数
public class Object {private Integer id;private String name;}@Overridepublic int hashCode() {return id;//如果没有对象的唯一值,可使用 return name.hashCode()}@Overridepublic boolean equals(Object objParam) {Object obj=(Object) objParam;return this.id==obj.id;}}Set<Object> objectSet = new HashSet<>();objectSet.add(object1);objectSet.add(object2);objectSet.add(object3);
使用 new HashSet()操作实际上是new HashMap<>()
HashMap.add方法中:要判断以下两点都为 true 才不会把数据添加到 HashMap 里
- hash值是否相同
hashCode() - 对应的值是否相同
equals()
在阿里巴巴Java开发是手册的集合处理中需要强制遵循如下规则:
1)只要重写equals,就必须重写hashCode 2)因为Set存储的是不重复的对象,依据hashCode和equals进行判断,所以Set存储的对象必须重写这两个方法3)如果自定义对象做为Map的键,那么必须重写hashCode和equals>
4、引用
[1] 忆之独秀.Java Set对象去重.CSDN:博客,2018-05-23
[2] tongkaiming.自定义对象去重(Set篇).CSDN:博客,2018-09-22
