Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hashtable类-这东西是否按照我认为的方式工作?包括的具体问题_Java_Hashtable - Fatal编程技术网

Java Hashtable类-这东西是否按照我认为的方式工作?包括的具体问题

Java Hashtable类-这东西是否按照我认为的方式工作?包括的具体问题,java,hashtable,Java,Hashtable,我已经编写了一个名为Node的类。我重写了它的hashCode()函数,以考虑节点的两个字段(还有第三个字段不影响my hashCode()函数)。我还编写了一个equals()函数,它考虑了所有三个字段 我试图使用Hashtable类来存储节点,以便在以后创建新节点时可以轻松地检查新节点是否与Hashtable中的节点重复。到目前为止,我有这个 Hashtable<Node,Node> hashTbl = new Hashtable<Node,Node>(); ..

我已经编写了一个名为Node的类。我重写了它的hashCode()函数,以考虑节点的两个字段(还有第三个字段不影响my hashCode()函数)。我还编写了一个equals()函数,它考虑了所有三个字段

我试图使用Hashtable类来存储节点,以便在以后创建新节点时可以轻松地检查新节点是否与Hashtable中的节点重复。到目前为止,我有这个

 Hashtable<Node,Node> hashTbl = new Hashtable<Node,Node>();
 ...
 Node node1 = // some new node
 hashTbl.put(node1,node1);
 ...
Hashtable hashTbl=new Hashtable();
...
Node node1=//一些新节点
hashTbl.put(node1,node1);
...
现在,假设我创建了一个名为node2的新节点,它的哈希值与node1完全相同,但不等于equals()方法定义的node1。我想检查node2是否与哈希表中的任何内容重复(不是),但是如果我使用constainsKey(),这不会给我一个假阳性吗?似乎使用containsValue()不会利用哈希表的效率。那么我怎样才能有效地做到这一点呢

另外,我的假设是,当我调用hashTbl.put(arg1,arg2)时,它调用arg1的hashCode()函数,并使用该值在“数组”中查找索引以将arg2放入其中。是这样吗


对不起,我有点困惑。谢谢大家。

你基本上是对的:hashtable(顺便说一句,是更新的、更推荐的类)使用
hashCode()
找到一个bucket来放入对象。如果发生冲突(同一个bucket中的另一个对象),它会在每个bucket中使用一个列表,使用
equals(object)
确定这个新对象是否已经等于散列中的一个对象(或者,在查找中,查看查找键是否与其中一个键值对匹配)。因此,在所有冲突中最坏的情况下,您的哈希将变成一个包含O(N)操作的列表。正如你所指出的,这是低效的


只要您的
equals(Object)
是正确的,就不会有函数问题——如果您的hashCode产生太多冲突,这只是效率问题。基本上,如果两个对象相等,它们必须具有相同的哈希代码以确保正确性;如果两个对象不相等,它们应该有不同的哈希代码以提高哈希效率。

你基本上是对的:hashtable(顺便说一句,是更新的、更推荐的类)使用
hashCode()
找到一个bucket来放入对象。如果发生冲突(同一个bucket中的另一个对象),它会在每个bucket中使用一个列表,使用
equals(object)
确定这个新对象是否已经等于散列中的一个对象(或者,在查找中,查看查找键是否与其中一个键值对匹配)。因此,在所有冲突中最坏的情况下,您的哈希将变成一个包含O(N)操作的列表。正如你所指出的,这是低效的


只要您的
equals(Object)
是正确的,就不会有函数问题——如果您的hashCode产生太多冲突,这只是效率问题。基本上,如果两个对象相等,它们必须具有相同的哈希代码以确保正确性;如果两个对象不相等,它们应该具有不同的哈希代码以提高哈希效率。

首先,您可能需要一个哈希集(或类似的东西),而不是哈希表-您所要做的只是检查成员资格,哈希集允许您这样做,而无需为每个键提供值

为了回答您的问题,确定将值放入数组中的哪个插槽,但每个插槽实际上都是一个链接列表。如果新键与链表中的任何其他键不
.相等
,则新键和值将放在链表中它们自己的节点中。仅为所有对象返回1是一个完全合法且正确的
.hashcode
实现。该实现的唯一问题是它将哈希表和类似的数据结构转换为链表(这显然会使您失去哈希表的所有性能优势)


简而言之,您的
.hashcode
方法将很好地工作。如果您放置大量不是
.equal
但具有相同哈希代码的对象,则性能会降低,但代码仍能正常运行。

首先,您可能需要哈希集(或类似的东西),而不是哈希表-您所要做的只是检查成员身份,HashSet允许您这样做,而无需为每个键提供值

为了回答您的问题,确定将值放入数组中的哪个插槽,但每个插槽实际上都是一个链接列表。如果新键与链表中的任何其他键不
.相等
,则新键和值将放在链表中它们自己的节点中。仅为所有对象返回1是一个完全合法且正确的
.hashcode
实现。该实现的唯一问题是它将哈希表和类似的数据结构转换为链表(这显然会使您失去哈希表的所有性能优势)

简而言之,您的
.hashcode
方法将很好地工作。如果您放置了大量非
.equal
但具有相同哈希代码的对象,则性能将降低,但代码仍能正常工作。

哈希表(或哈希映射)包含N个容器,其中一个容器可以容纳多个对象。(每个bin实际上是一个Map.Entry的链接列表)。密钥的hashCode()用于确定bin。但是,在确定bin之后,将在该键上使用equals()来查看该键是否已经存在。因此,如果将node1和node2放入哈希表中,并且它们都具有相同的hashCode(),但不相等,它们将进入同一个bin,但该bin将是一个长度为2的链表,具有两个键node1和node2以及相应的值

containsKey()不会给您假阳性,