Java 以HashMap为背景的集合的精度';s contains()方法?

Java 以HashMap为背景的集合的精度';s contains()方法?,java,hashmap,set,hashcode,hash-code-uniqueness,Java,Hashmap,Set,Hashcode,Hash Code Uniqueness,嗨,我正在使用一个HashMap支持的集合来跟踪我在图中已经遍历的边。 我计划通过添加存储在每个边缘中的数据的哈希代码来设置关键帧 v.getData().hashCode() + wordV.getData().hashCode() 但是当使用contains检查边是否在集合中时,这有多可靠?我不能假设得到一个假阳性吗?有没有办法克服这个问题 引起我担忧的确切说法是: edgeSet.contains(v.getData().hashCode() + wordV.getData().hash

嗨,我正在使用一个HashMap支持的集合来跟踪我在图中已经遍历的边。 我计划通过添加存储在每个边缘中的数据的哈希代码来设置关键帧

v.getData().hashCode() + wordV.getData().hashCode()
但是当使用contains检查边是否在集合中时,这有多可靠?我不能假设得到一个假阳性吗?有没有办法克服这个问题

引起我担忧的确切说法是:

edgeSet.contains(v.getData().hashCode() + wordV.getData().hashCode())
谢谢

哦,顺便说一下,我正在使用Java

编辑:

我应该在问题中说明这一点。在我的图中没有边对象,有顶点对象,每个顶点对象都包含一个多个顶点对象的列表,这就是边。因此,我想结合你的回答,接下来的问题是:

我是否可以使用集合来存储与对象相对的信息引用。。。。? i、 e.我可以存储添加顶点数据对象的两个哈希代码的结果吗

编辑2:

我确实在使用Java库作为hashmap,我声明如下:

Set<Integer> edgeSet = Collections.newSetFromMap(new ConcurrentHashMap<Integer, Boolean>());
Set-edgeSet=Collections.newSetFromMap(新的ConcurrentHashMap());

只要您同时覆盖
hashCode()
equals()
,您就可以了。哈希代码永远不能保证是唯一的。也就是说,你有点误用了电视。通过使用正确实现的
hashCode()
equals()
方法存储类,像
contains()
'这样的方法将具有完美的准确性。然而,这不是你在这里使用它的方式。就像你几乎在构建自己的数据结构/集合一样,你需要考虑和哈希集相同的方式使用哈希图来存储散列的散列值——哈希值作为关键字,然后收集一个任意的值作为比较的值。这将允许您快速查看父映射是否包含您正在查找的哈希。如果没有,则完成(错误)。如果是,那么您需要确认它的“bucket”具有您要查找的特定值(true)。

只要您同时覆盖
hashCode()
equals()
,您就可以了。哈希代码永远不能保证是唯一的。也就是说,你有点误用了电视。通过使用正确实现的
hashCode()
equals()
方法存储类,像
contains()
'这样的方法将具有完美的准确性。然而,这不是你在这里使用它的方式。就像你几乎在构建自己的数据结构/集合一样,你需要考虑和哈希集相同的方式使用哈希图来存储散列的散列值——哈希值作为关键字,然后收集一个任意的值作为比较的值。这将允许您快速查看父映射是否包含您正在查找的哈希。如果没有,则完成(错误)。如果是,那么您需要确认它的“bucket”是否具有您要查找的特定值(true)。

注意:从您的问题中,我无法判断您是在使用,还是您自己的自制实现。请注意,Java的
HashSet
只是
HashMap
的包装器,其中忽略了值
HashSet.contains
只需在内部映射上调用
containsKey

HashMap.containsKey
使用与
get
相同的查找。这将计算散列并使用它找到正确的bucket。从那里,它将遍历bucket并使用
equals
,直到找到精确匹配。假设元素类型正确地实现了
hashCode
equals
,那么使用
containsKey
不会出现误报,因为
equals
最终用于确认

在包私有方法
getEntry
中,由
containsKey
get
使用:

final Entry<K,V> getEntry(Object key) {
    int hash = (key == null) ? 0 : hash(key.hashCode());
    for (Entry<K,V> e = table[indexFor(hash, table.length)];
         e != null;
         e = e.next) {
        Object k;
        if (e.hash == hash &&
            ((k = e.key) == key || (key != null && key.equals(k))))
            return e;
    }
    return null;
}
final Entry getEntry(对象键){
int hash=(key==null)?0:hash(key.hashCode());
for(条目e=表[indexFor(hash,table.length)];
e!=null;
e=e.next){
对象k;
如果(e.hash==hash&&
((k=e.key)==key | |(key!=null&&key.equals(k)))
返回e;
}
返回null;
}
编辑:

我是否可以使用集合来存储对信息的引用,而不是 物体。。。。?i、 e.我可以存储两个哈希代码相加的结果吗 对于顶点的数据对象


不,您需要实现一个表示此信息的新类,并将其实例存储在
集中。这可能是一个简单的POJO,每个信息都有一个字段,并且正确覆盖了
hashCode
equals

注意:从您的问题中,我无法判断您是在使用,还是您自己的自制实现。请注意,Java的
HashSet
只是
HashMap
的包装器,其中忽略了值
HashSet.contains
只需在内部映射上调用
containsKey

HashMap.containsKey
使用与
get
相同的查找。这将计算散列并使用它找到正确的bucket。从那里,它将遍历bucket并使用
equals
,直到找到精确匹配。假设元素类型正确地实现了
hashCode
equals
,那么使用
containsKey
不会出现误报,因为
equals
最终用于确认

在包私有方法
getEntry
中,由
containsKey
get
使用:

final Entry<K,V> getEntry(Object key) {
    int hash = (key == null) ? 0 : hash(key.hashCode());
    for (Entry<K,V> e = table[indexFor(hash, table.length)];
         e != null;
         e = e.next) {
        Object k;
        if (e.hash == hash &&
            ((k = e.key) == key || (key != null && key.equals(k))))
            return e;
    }
    return null;
}
final Entry getEntry(对象键){
int hash=(key==null)?0:hash(key.hashCode());
for(条目e=表[indexFor(hash,table.length)];
e!=null;
e=e.next){
HashSet<Integer> traversed = new HashSet<Integer>();
if(traversed.contains(edgeNumber)) ...
traversed.add(3);