Java 集集合 - 覆盖等于方法

2022-09-01 18:23:07

有没有办法重写数据类型使用的方法?我为一个名为 的类编写了一个自定义方法。现在我有一个,我想确保没有重复的条目。因此,我正在考虑使用 a 而不是 a ,但决定两个费用是否相等的标准位于类中的覆盖方法中。equalsSetequalsFeeLnkedListFeeSetLinkedListequalsFee

如果使用 ,我将不得不循环访问每个列表项,并在类中调用重写的方法,并将其余条目作为参数。仅阅读此内容听起来处理得太多,会增加计算复杂性。LinkedListequalsFee

是否可以与重写的方法一起使用?我应该吗?Setequals


答案 1

正如杰夫·福斯特所说:

Set.equals() 方法仅用于比较两个集合的相等性。

您可以使用 a 来删除重复的条目,但请注意:不要使用其包含对象的方法来确定相等性。SetHashSetequals()

A 带有一个带有条目的内部,并使用 equals() 以及 HashCode 的 equals 方法来确定相等性。HashSetHashMap<Integer(HashCode), Object>

解决此问题的一种方法是在集合中重写类,以便它表示您的条件hashCode()equals()

例如:

class Fee {
      String name;

  public boolean equals(Object o) {
      return (o instanceof Fee) && ((Fee)o.getName()).equals(this.getName());
  }

  public int hashCode() {
      return name.hashCode();
  }

}

答案 2

您可以并且应该使用 Set 来保存具有重写等于方法的对象类型,但您可能还需要重写 hashCode()。相等的对象必须具有相等的哈希代码。

例如:

public Fee{

    public String fi;

    public String fo;

    public int hashCode(){

        return fi.hashCode() ^ fo.hashCode();
    }

    public boolean equals(Object obj){

        return fi.equals(obj.fi) && fo.equals(obj.fo);
    }
}

(当然,根据需要使用空检查。

集合通常使用 hashCode() 来优化性能,如果您的 hashCode 方法被破坏,则会行为异常。例如,HashSet 使用内部 HashMap。

如果你检查HashMap的源代码,你会看到它依赖于元素的hashCode()和equals()方法来确定相等性:

if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {

如果未正确生成哈希值,则可能永远不会调用您的 equals 方法。

若要加快集合速度,应尽可能为不相等的对象生成不同的哈希代码。


推荐