java - HashSet的retainAll使用接口(interface)

标签 java collections equals

我有一些代码尝试使用 HashSet.retainAll() 函数。

在下面的示例代码中,HashSet 包含接口(interface) IPerson,但对象 Person 中的 equals 函数永远不会到达。我什至尝试在界面中公开 equals 函数和其他一些东西。我觉得我已经尝试了一切。如何让 retainAll() 使用我实现的 equal 函数?

class Person implements IPerson {
  private String name;
  public Person(String name){
    this.name = name;
  }

  @Override
  public boolean equals(Object obj){
    System.out.println("calling equals");
    return super.equals(Object obj);
  }

}

HashSet<IPerson> persons1 = new HashSet<IPerson>();
persons1.add(new Person("Jane"));
persons1.add(new Person("Joel"));
persons1.add(new Person("Joe"));

HashSet<IPerson> persons2 = new HashSet<IPerson>();
persons2.add(new Person("Jane"));
persons2.add(new Person("Joel"));

persons1.retainAll(persons2);
// expect sysout from Person.equals()

System.out.println(persons1.size());
// prints 0

最佳答案

您需要考虑name来检查相等性并将其包含在计算hashCode中,同时确保您遵循hashcode and equals contract

关于java - HashSet的retainAll使用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24374127/

相关文章:

c# - 迭代集合中所有唯一对的简单方法

java - Java 中的契约(Contract)检查 - 内置?例如。哈希码/等于

javascript - jQuery 如果多个对象等于相同的值

java - 从 Java 运行 Oracle import 命令并查看控制台输出

java - 将数组转换为列表时出现编译器错误?

java - 让静态方法返回私有(private)类的设计决策背后的原因是什么?比如 Collections.synchronizedList()

javascript - js宽度等于父高度

java - 列表仅填充 JSON 中的一行,应该填充多行

java - 避免许多 if 语句,代码改进

java - json .makeHttpRequest(url, "GET",params) 多次调用时忽略 URL 参数? Android/PHP Web 服务问题