重写hashcode方法时的HashMap性能
在HashMap
,如果我将自定义对象作为键。
如果我覆盖hashCode()
方法并将其实现为将值传递为’ 1
‘,会发生什么情况; 会不会有任何表现?
如果我改变hashCode()
方法使用Math.random()
函数返回随机值会对性能产生什么影响?
添加Math.random()不会影响性能,但通过random()函数构造哈希码值是个坏主意。 相反,您可以使用一些良好的散列函数来最小化碰撞,并且也可以更快。 供参考,您可以查看一些链接http://www.partow.net/programming/hashfunctions/
如果你指的是渐近时间复杂度,那么:
因为如果你从hashCode
返回1
, HashMap
使用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合约。 值将被分配给随机区间并在随机区域中查找,因此没有任何东西可以保证您将找到先前存储的值。