Java 重写hashcode方法时的HashMap性能

Java 重写hashcode方法时的HashMap性能,java,dictionary,collections,Java,Dictionary,Collections,在HashMap中,如果我将自定义对象作为键 如果我重写会发生什么 hashCode()方法,并将其实现为将值作为“1”传递;会不会有任何性能上的冲击 如果我更改hashCode()方法以使用Math.random()函数返回随机值 性能会发生什么变化?始终在hashCode()中返回1将降低HashMap的性能。每个对象默认为同一个bucket,哈希表成为链表。根据,你得到的是二次时间而不是线性时间 返回随机值将违反相等对象具有相等哈希代码的规定,您将无法检索存储的对象。如果您指的是渐近时间复

HashMap
中,如果我将自定义对象作为键

如果我重写会发生什么
hashCode()
方法,并将其实现为将值作为“
1
”传递;会不会有任何性能上的冲击

如果我更改
hashCode()
方法以使用
Math.random()
函数返回随机值
性能会发生什么变化?

始终在
hashCode()
中返回
1
将降低
HashMap
的性能。每个对象默认为同一个bucket,哈希表成为链表。根据,你得到的是二次时间而不是线性时间


返回随机值将违反相等对象具有相等哈希代码的规定,您将无法检索存储的对象。

如果您指的是渐近时间复杂度,则:

由于如果从
hashCode
返回
1
,则
HashMap
使用
hashCode
计算要在哈希表中使用的存储桶,因此有效地使
HashMap
的性能类似于(未排序的)
链接列表的性能

返回随机值只会使
HashMap
爆炸,因为
equal
对象不再具有equal
hashCode
s

摘录自:

总之,你输了:

  • 搜索
    HashMap
    时的时间复杂度(从
    O(1)
    O(n)
  • HashMap
    中查找(它将不再工作)

如果始终返回
1
(或所有要插入的对象的任何其他常量值),则
哈希映射将在内部降级为“链表”。这意味着插入、删除和查询的复杂性将不再是O(1),而是O(n),并且可能会造成严重的性能损失

如果返回随机值,则
HashMap
将变得不一致。“同一”键可能出现两次(尽管根据规范,每个键只能出现一次)。也可能会出现这样的情况,即您无法找到某个键的值,尽管您之前插入了它(使用不同的哈希代码)


确切的行为也将取决于
equals
方法的实现,但这是这种实现的主要效果。

在hashcode()中返回固定值肯定会使哈希表运行变慢。所有值都将分配给同一个bin,因此查找操作将花费线性时间(而不是使用适当的哈希函数的平均常量时间)

返回一个随机值将完全破坏hashmap契约。值将被分配到随机存储箱并在随机存储箱中查找,因此没有任何东西可以保证您会找到以前存储的值。

添加数学。random()不会对性能造成太大影响,但通过random()函数构造hashcode值是个坏主意。相反,您可以使用一些好的散列函数来最小化冲突,而且速度也快得多。 作为参考,您可以查看一些链接

试试看。但是,这只是出于好奇,因为
hashCode
不是任意的。如果更改
hashCode()
方法以返回随机值,性能可能会做很多事情,但您的程序将完全崩溃,因为它不会再得到正确的结果了。你稍微误解了有效Java中的这句话。平均而言,哈希访问是O(1),而链表(或退化哈希表)的访问时间是O(n)。因此,如果你有一个算法,它进行n次散列访问,这有O(n)个平均复杂度(因为O(n)=O(n)·O(1))但是O(n²)个最坏情况的复杂度。你在这里插入的表的目的是什么?好的,我去掉了不相关的部分。
+----------------------+----------+------------+----------+--------------+
|                      |  Insert  |   Delete   |  Search  | Space Usage  |
+----------------------+----------+------------+----------+--------------+
| Unsorted linked list | O(1)*    | O(1)*      | O(n)     | O(n)         |
| Hash table           | O(1)     | O(1)       | O(1)     | O(n)         |
+----------------------+----------+------------+----------+--------------+