通过哈希检查HashSet中是否存在元素

时间:2015-02-23 17:11:33

标签: java hashcode hashset

如果我只有对象的哈希码,而不是对象本身,我可以检查对象是否在HashSet中吗?

6 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

您可以创建一个特殊对象,类似这样的

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

答案 2 :(得分:1)

不,你不能。在散列集合中查找对象时需要equals和hashcode。 hashcode方法告诉哪个桶找到对象,equals方法在桶中找到对象。

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

  1. 我去哪家?
  2. 我找到了谁?
  3. 这里(1)将通过哈希码回答,(2)将通过等号方法回答。

答案 3 :(得分:1)

hashCode不是唯一标识属性,所以没有。

答案 4 :(得分:1)

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

答案 5 :(得分: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..
  }
}