簡體   English   中英

以下情況的 hashCode() 方法:當兩個集合至少有一個共同元素時,它們是否相等?

[英]The hashCode() method for the following case: two sets are equal when they have at least one element in common?

我目前面臨這樣一種情況:我有字符串元組(大小為 2),如果兩個元組至少有一個共同元素,則應認為它們相等。 我有以下類實現這個想法:

public class MyTuple
{
    private List<String> list = Arrays.asList(new String[2]);

    public List<String> getList()
    {
        return list;
    }

    public void set(String firstElement, String secondElement)
    {
        list.set(0, firstElement);
        list.set(1, secondElement);
    }

    @Override
    public boolean equals(Object other)
    {
        if (other instanceof MyTuple) {
            return !Collections.disjoint(this.list, ((MyTuple) other).getList());
        }
        return false;
    }
}

但是,根據hashCode()合同:

如果根據 equals(Object) 方法兩個對象相等,則對兩個對象中的每一個調用 hashCode() 方法必須產生相同的整數結果。

如何覆蓋我的hashCode()方法而不違反合同?

在考慮hashCode()之前,我認為您應該首先重新考慮您的equals()設計。 我認為您無法實施equals()並履行所需的合同——尤其是關於傳遞性的合同

來自: Java Doc of Object#equals()

equals 方法在非空對象引用上實現等價關系:

  • 它是自反的:對於任何非空引用值 x,x.equals(x) 應該返回 true。

  • 它是對稱的:對於任何非空引用值 x 和 y,當且僅當 y.equals(x) 返回 true 時,x.equals(y) 才應返回 true。

  • 它是可傳遞的:對於任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true 並且 y.equals(z) 返回 true,那么 x.equals(z) 應該返回 true。

  • 它是一致的:對於任何非空引用值 x 和 y,x.equals(y) 的多次調用始終返回 true 或始終返回 false,前提是對象的 equals 比較中使用的信息沒有被修改。

  • 對於任何非空引用值 x,x.equals(null) 應返回 false。

為什么? 我可以構造你的MyTuple三個對象:

  • A = {x1, x2}
  • B = {x2, x3}
  • C = {x3, x4}

其中x1x2x3x4都是不同的。 我現在有

  • A.equals(B) 返回真
  • B.equals(C) 返回真
  • C.equals(A) 返回 false

他們違反了傳遞性契約。

我認為您應該考慮使用自己的另一種關系(可能是partialEquals() ),這樣您就不必遵守合同。 但是你也不能使用像equals()這樣的方法並期望MyTuple工作,例如,在HashMapHashSet

暫無
暫無

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

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