1、问题

Java中如何使用集合Set对对象去重?

2、背景

最近使用Spring boot做服务端项目,需要对一个List<Object> 去重,属于入门级操作。

3、解决方案

1、使用 TreeSet :重写TreeSetComparator

  1. Comparator<Object> comparator=new Comparator<Object>() {
  2. @Override
  3. public int compare(Object obj1, Object obj2) {
  4. // 当两个id相等时及判断两个对象相等
  5. boolean equalStatus = obj1.getId().compareTo(obj2.getId());
  6. return equalStatus
  7. }
  8. // 使用comparator初始化TreeSet
  9. Set<Object> set = new TreeSet<Object>(comparator);

2、使用 HashSet :重写Entity的 hashCode()equals() 函数

  1. public class Object {
  2. private Integer id;
  3. private String name;
  4. }
  5. @Override
  6. public int hashCode() {
  7. return id;//如果没有对象的唯一值,可使用 return name.hashCode()
  8. }
  9. @Override
  10. public boolean equals(Object objParam) {
  11. Object obj=(Object) objParam;
  12. return this.id==obj.id;
  13. }
  14. }
  15. Set<Object> objectSet = new HashSet<>();
  16. objectSet.add(object1);
  17. objectSet.add(object2);
  18. 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