Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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 我可以重写equals()以在散列过程中进行比较计数吗?_Java_Collections_Hashtable - Fatal编程技术网

Java 我可以重写equals()以在散列过程中进行比较计数吗?

Java 我可以重写equals()以在散列过程中进行比较计数吗?,java,collections,hashtable,Java,Collections,Hashtable,我们创建了两个自定义类,比如A和B,其中A由一对整数定义,B由A类型的数组定义(B是一个整数对数组)。我试图使用B数组中的第一对作为散列键,在一个哈希表中存储大量B对象。我已经重写了这两个类的hashCode,在重写A的equals()方法时,我试图增加一个比较计数器,如下所示: public boolean equals(Object b) { comparisons++; //predefined as a field of A return int1==((A)b).int1 &

我们创建了两个自定义类,比如A和B,其中A由一对整数定义,B由A类型的数组定义(B是一个整数对数组)。我试图使用B数组中的第一对作为散列键,在一个哈希表中存储大量B对象。我已经重写了这两个类的hashCode,在重写A的equals()方法时,我试图增加一个比较计数器,如下所示:

public boolean equals(Object b)
{
  comparisons++; //predefined as a field of A 
  return int1==((A)b).int1 && int2==((A)b).int2;
}   
然而,虽然我相信这段代码是有意义的,但主要是这样使用它:

B b = new B(pairsOfA);
key = b.pairs[0]; //use first pair as key for hash table
hTable.put(key, b);
comparisons = comparisons + hTable.get(key).pairs[0].comparisons;

只获取get方法中使用的比较次数,因为在我假设的搜索过程中,每个表成员只比较一次。有没有一种方法可以在使用重写hashTable.put()进行散列时计算比较数?

作为旁注,如果您还没有这样做,您还应该检查equals方法中的
b
类,否则您可能会在任何地方得到classcastexception或nullpointerexception。您正在计算对
equals()的调用数
put()
调用期间,但是如果哈希值解析为空的bucket,则没有可比较的对象,因此不会调用
equals()
。bucket为空的频率取决于哈希函数的性能和加载因子(默认值为
0.75
on)。我不认为这是@Andreas(唯一)的问题,因为在使用get()检索存储对象时,每次检索都会将比较设置为1,并且我的总比较次数始终等于输入。但是我不知道如何在不使用get()的情况下访问表中的对象。我不知道您期望的是什么,因为一个完全分布的哈希每个bucket最多有一个对象,并且在空bucket中插入一个新密钥不需要比较,检索一个对象需要1次比较,以检查在bucket中找到的密钥是否正确。你所看到的正是你所期望的。如果您想看到bucket冲突,请设置更高的负载因子,并确保填充初始容量。我们应该计算将N个对象添加到适当大小的哈希表所需的比较次数。我对hashTable的内置功能还不太了解,还不足以理解所比较的内容。