java - 覆盖哈希码和等于的问题

标签 java overriding 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");
}

它总是打印 Not Equal。 这里有什么问题?

最佳答案

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

关于java - 覆盖哈希码和等于的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10710577/

相关文章:

java - Web 应用程序项目 netbeans 和 glassfish 部署错误

Java-热衷于只有 1 个按钮来来回切换,而不是两个按钮?

scala - 重写 scala 中的 toString 并使用默认参数创建第二个 toString 方法

java - 如何获取覆盖 hashCode() 的对象的唯一 ID?

java - 为自定义类生成 hashCode()

java - 哈希码是在调用 hashcode() 方法时生成的

java - Groovy/Java : Ini4j insert multiple values to single parameter in different lines

java - @override onResume 使用但屏幕重置

scala - 重写 final方法

java - 在 GWT 的客户端生成随机代码