1、问题
Java中如何使用集合Set
对对象去重?
2、背景
最近使用Spring boot做服务端项目,需要对一个List<Object>
去重,属于入门级操作。
3、解决方案
1、使用 TreeSet
:重写TreeSet
的Comparator
Comparator<Object> comparator=new Comparator<Object>() {
@Override
public int compare(Object obj1, Object obj2) {
// 当两个id相等时及判断两个对象相等
boolean equalStatus = obj1.getId().compareTo(obj2.getId());
return equalStatus
}
// 使用comparator初始化TreeSet
Set<Object> set = new TreeSet<Object>(comparator);
2、使用 HashSet
:重写Entity的 hashCode()
和 equals()
函数
public class Object {
private Integer id;
private String name;
}
@Override
public int hashCode() {
return id;//如果没有对象的唯一值,可使用 return name.hashCode()
}
@Override
public 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