重写hashcode方法时的HashMap性能

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

如果我覆盖hashCode()方法并将其实现为将值传递为’ 1 ‘,会发生什么情况; 会不会有任何表现?

如果我改变hashCode()方法使用Math.random()函数返回随机值会对性能产生什么影响?

添加Math.random()不会影响性能,但通过random()函数构造哈希码值是个坏主意。 相反,您可以使用一些良好的散列函数来最小化碰撞,并且也可以更快。 供参考,您可以查看一些链接http://www.partow.net/programming/hashfunctions/

如果你指的是渐近时间复杂度,那么:

因为如果你从hashCode返回1HashMap使用hashCode来计算在哈希表中使用哪个桶,你可以有效地使你的HashMap的性能像(未排序的) LinkedList的性能。

返回随机值只会使HashMap失效,因为equal对象将不再具有相同的hashCode

维基百科摘录:

 +----------------------+----------+------------+----------+--------------+ | | 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) | +----------------------+----------+------------+----------+--------------+ 

总结一下,你输了:

  • 搜索HashMap时的时间复杂度(从O(1)O(n)
  • 在你的HashMap查找(它将不再起作用)

始终在hashCode()返回1将降低HashMap的性能。 每个对象默认为同一个存储桶,并且哈希表成为链接列表。 根据Effective Java,第9项 ,您得到二次时间而不是线性时间。

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

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

如果您返回了随机值,那么HashMap将变得不一致。 可能会发生“相同”键出现两次(尽管根据规范,每个键可能只出现一次)。 虽然您之前插入了某个键(使用不同的hashCode),但您可能还会找不到某个键的值。

确切的行为也将取决于equals方法的实现,但这些是这种实现可能产生的主要影响。

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

返回随机值将完全破坏hashmap合约。 值将被分配给随机区间并在随机区域中查找,因此没有任何东西可以保证您将找到先前存储的值。