2015-02-23 33 views

回答

9

您不能,因为hashCode仅用于定位对象存储在HashSet内的bin。同一个分箱中可能有多个元素,并且HashSet使用equals来确定搜索到的元素是否存在于hashCode映射到的分箱中。

bin可能包含多个元素具有相同的hashCode,所以只知道hashCode是不够的。

+0

难道你不能迭代比较内容的相应hashCodes与已知的hashCode吗?不一定优雅,但可行 – Tgsmith61591 2015-02-23 17:16:34

+4

@ Tgsmith61591如果多个元素具有相同的hashCode会怎样? – Eran 2015-02-23 17:17:14

1

不,你不能。在散列集合中查找对象时,equals和hashcode都是必需的。散列码方法告诉哪个存储桶找到对象,equals方法在存储桶中查找对象。

一个真实世界的例子将是一个有很多人的房子。如果你告诉我去某个房子里找人,我会问你两个问题:

  1. 什么房子我去?
  2. 我能找到谁?

这里(1)将通过哈希码来回答,(2)将通过等于方法回答。

1

A hashCode不是一个独特的识别属性,所以没有。

1

不,因为2个对象可以具有相同的哈希码。检查Set(或中的密钥)中的对象的唯一性是针对hashCode()equals()进行检查的。

3

你可以做一个特殊的对象,像这样

int hashCode = 1; // your 
new Object() { 
    @Override 
    public boolean equals(Object obj) { 
     return true; 
    } 
    @Override 
    public int hashCode() { 
     return hashCode; 
    } 
}; 
+0

这很聪明,但它取决于调用'cleverObject.equals(objectInSet)'的集合。如果有任何测试'objectInSet.equals(cleverObject)'的设置实现,或者java.util中的实现发生更改,则会中断。换句话说,你违反了'平等'合同,你可能会放弃一段时间,但它可能会回来咬你。 – 2015-02-23 17:33:55

0

所有对象方法的hashCode(),由HashSet的,HashMap中,ECC叫..

您可以覆盖此方法来定义自己的逻辑

@Override 
    public int hashCode() { 
     return <<MY CODE HERE>>; 
    } 

,或者更简单,迭代你的HashSet和检查的hashCode()值

int myHash = 123; 
for(Object o:mySet){ 
    if(myHash == o.hashCode()){ 
    // do something.. 
    } 
}