【问题标题】:issue with overriding hashcode and equals覆盖哈希码和等于的问题
【发布时间】:2012-05-22 21:39:34
【问题描述】:

我想创建一个将字符串列表作为输入的类。 我想覆盖这个类的 hashcode 和 equals ,这样当发送的字符串列表无论它们的顺序如何都相等时,这个类将始终返回 true。

代码如下:

public final class TableValues
{
    private final String[] tableValue;

    TableValues(final String[] values)
    {
        this.tableValue = values;
    }

    /**
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + Arrays.hashCode(tableValue);
        return result;
    }

    /**
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(final Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        final TableValues other = (TableValues) obj;
        if (!Arrays.equals(tableValue, other.tableValue))
            return false;
        return true;
    }
}

但是当我这样做时:

final String[] str1 = {"A", "B", "C"};
final String[] str2 = {"B", "C", "A"};
final TableValues tab1 = new TableValues(str1);
final TableValues tab2 = new TableValues(str2);
if (tab1.equals(tab2))
{
    System.out.println("Equal");
}
else
{
    System.out.println("Not Equal");
}

它总是打印不等于。 这里有什么问题?

【问题讨论】:

  • 您的哈希码算法会为不同顺序的字符串提供不同的哈希码。我不认为那是你想要发生的事情。

标签: java overriding hashcode


【解决方案1】:

两个TableValues 实例不相等,因为数组不相等。这是因为数组中元素的顺序很重要。如果您想要不区分顺序的匹配,则必须将其添加到您的代码中,以便它考虑两个具有相同内容但排序不同的数组作为相同的 使用字符串的Set,以防排序不是很重要。

【讨论】:

  • 我会说Set 是个坏主意,因为它会为["a", "a"]["a"] 产生相同的结果。我会说在创建时对数组进行排序(如果顺序不重要),或者如果原始顺序很重要,则创建一个单独的数组并对其进行排序。
  • @Dunes:我假设这些字符串代表表列名,因此不可能重复。如果可以复制,那么是的,我同意你的看法。
  • 似乎是一个公平的假设,您的答案比公认的答案更好。
【解决方案2】:

尝试改变:

if (!Arrays.equals(tableValue, other.tableValue))
        return false;

到:

if (!Arrays.equals(Arrays.sort(tableValue), Arrays.sort(other.tableValue)))
        return false;

来自 Arrays.equals 的文档:

如果两个数组包含相同的元素,则它们相等 顺序。

由于无论顺序如何,您都需要它们相等,因此您必须先对它们进行排序,以便Arrays.equal 认为它们相等。

【讨论】:

  • 别忘了在 hashCode() 方法中也执行排序。相等的对象必须产生相同的哈希码(在这些方法的合同中定义)。
猜你喜欢
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多