簡體   English   中英

重寫hashcode和equals的問題

[英]issue with overriding hashcode and equals

我想創建一個將字符串列表作為輸入的類。 我想覆蓋這個類的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實例不相等,因為數組不相等。 這是因為陣列中元素的順序很重要。 如果您想要對順序不敏感的匹配,則必須在代碼中添加它,以便它將兩個具有相同內容但排序順序相同的數組視為相同, 或者在大小寫排序中使用一Set字符串並不重要。

嘗試改變:

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

至 :

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

從Arrays.equals的文檔:

如果兩個數組包含相同順序的相同元素,則它們是相等的。

因為無論順序如何都需要它們是相等的,所以你必須先為Arrays.equal排序它們。等於認為它們是相等的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM