Java 重写hashcode和equals时出现问题

Java 重写hashcode和equals时出现问题,java,overriding,hashcode,Java,Overriding,Hashcode,我想创建一个将字符串列表作为输入的类。 我想重写这个类的hashcode和equals,这样当发送的字符串列表相等时,不管它们的顺序如何,这个类总是返回true 代码如下: public final class TableValues { private final String[] tableValue; TableValues(final String[] values) { this.tableValue = values; }

我想创建一个将字符串列表作为输入的类。 我想重写这个类的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");
}
它总是不相等。
这里出了什么问题?

两个
TableValues
实例不相等,因为数组不相等。这是因为数组中元素的顺序很重要。如果要进行顺序不敏感匹配,则必须将其添加到代码中,以便它将具有相同内容但不同顺序的两个数组视为相同数组,或者在顺序不重要的情况下使用字符串集。

尝试更改:

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

从Arrays.equals的文档中:

如果两个数组在同一个数组中包含相同的元素,则它们是相等的 秩序


因为不管顺序如何,都需要它们是相等的,所以你必须先对它们进行排序>代码>数组。同样的< /代码>认为它们是相等的。

我会说<代码> SET>代码>是坏主意,因为它将产生与<> > [ a ]、“a”] /<代码>和< > > [a ] 相同的结果。我会说在创建时对数组进行排序(如果顺序不重要),或者创建一个单独的数组,如果原始顺序重要,则进行排序。@Dunes:我假设这些字符串代表表列名,因此不可能重复。如果可以复制,那么是的,我同意你的看法。这似乎是一个公平的假设,你的答案比公认的答案要好。你的哈希码算法将为不同的字符串顺序提供不同的哈希码。我认为这不是您希望发生的事情。不要忘记在hashCode()方法中也执行排序。相等的对象必须生成相同的哈希代码(如这些方法的契约中所定义)。
if (!Arrays.equals(Arrays.sort(tableValue), Arrays.sort(other.tableValue)))
        return false;