![](/img/trans.png)
[英]Fastest (runtime) way to check if two very long arrays have at least one common element?
[英]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
三個對象:
其中x1
、 x2
、 x3
、 x4
都是不同的。 我現在有
他們違反了傳遞性契約。
我認為您應該考慮使用自己的另一種關系(可能是partialEquals()
),這樣您就不必遵守合同。 但是你也不能使用像equals()
這樣的方法並期望MyTuple
工作,例如,在HashMap
、 HashSet
等
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.