如果我只有对象的散列码而不是对象本身,我可以检查对象是否在HashSet
中?检查HashSet中是否存在元素的散列
回答
您不能,因为hashCode
仅用于定位对象存储在HashSet
内的bin。同一个分箱中可能有多个元素,并且HashSet
使用equals
来确定搜索到的元素是否存在于hashCode
映射到的分箱中。
bin可能包含多个元素具有相同的hashCode
,所以只知道hashCode
是不够的。
不,你不能。在散列集合中查找对象时,equals和hashcode都是必需的。散列码方法告诉哪个存储桶找到对象,equals方法在存储桶中查找对象。
一个真实世界的例子将是一个有很多人的房子。如果你告诉我去某个房子里找人,我会问你两个问题:
- 什么房子我去?
- 我能找到谁?
这里(1)将通过哈希码来回答,(2)将通过等于方法回答。
A hashCode
不是一个独特的识别属性,所以没有。
不,因为2个对象可以具有相同的哈希码。检查Set
(或中的密钥)中的对象的唯一性是针对hashCode()
和equals()
进行检查的。
你可以做一个特殊的对象,像这样
int hashCode = 1; // your
new Object() {
@Override
public boolean equals(Object obj) {
return true;
}
@Override
public int hashCode() {
return hashCode;
}
};
这很聪明,但它取决于调用'cleverObject.equals(objectInSet)'的集合。如果有任何测试'objectInSet.equals(cleverObject)'的设置实现,或者java.util中的实现发生更改,则会中断。换句话说,你违反了'平等'合同,你可能会放弃一段时间,但它可能会回来咬你。 – 2015-02-23 17:33:55
所有对象方法的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..
}
}
- 1. 检查mongodB中是否存在元素
- 2. 检查Selenium中是否存在元素
- 3. 检查DOM中是否存在元素
- 4. 检查列表中的元素是否存在于python列表的元素中
- 5. 检查元素是否在序列中
- 6. 检查列表元素是否存在于另一个列表的元素中
- 7. 检查ListViewItemCollection元素是否存在
- 8. JAXB - 检查是否存在子元素
- 9. 检查根元素是否存在
- 10. 如何检查元素是否存在?
- 11. 检查数组元素是否存在
- 12. 检查元素是否存在
- 13. 检查ArrayList元素是否存在
- 14. 检查NSMutableArray元素是否存在
- 15. 检查一个元素是否存在
- 16. 如何检查元素是否存在?
- 17. 检查XPath是否存在元素
- 18. jQuery检查元素是否存在onClick
- 19. 检查数组元素是否存在
- 20. 检查表单元素是否存在
- 21. 检查元素是否存在
- 22. 检查DIV内是否存在元素
- 23. as3 xml检查元素是否存在
- 24. 散列中是否存在隐藏的空白元素?
- 25. 检查父元素中是否存在元素
- 26. Scala检查列表中是否存在元素
- 27. 检查球拍列表中是否存在元素
- 28. GNU-make检查元素是否存在于列表/数组中
- 29. 如何检查列表中是否存在元素python
- 30. Python如何检查列表中是否存在元素?
难道你不能迭代比较内容的相应hashCodes与已知的hashCode吗?不一定优雅,但可行 – Tgsmith61591 2015-02-23 17:16:34
@ Tgsmith61591如果多个元素具有相同的hashCode会怎样? – Eran 2015-02-23 17:17:14