重写hashcode和equals的问题

时间:2012-05-22 21:39:34

标签: java override hashcode

我想创建一个将字符串列表作为输入的类。 我想覆盖这个类的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");
}

它始终打印不等于。 这有什么不对?

2 个答案:

答案 0 :(得分:2)

两个TableValues实例不相等,因为数组不相等。这是因为阵列中元素的顺序很重要。如果你想要对顺序不敏感的匹配,你必须在你的代码中添加它,以便它考虑两个具有相同内容但不同排序的数组,因为使用Set字符串进行大小写排序并不重要。

答案 1 :(得分:1)

尝试更改:

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

到:

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

来自Arrays.equals的文档:

  

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

由于无论顺序如何都要求它们相等,您必须先对它们进行排序Arrays.equal才能认为它们是相等的。