【问题标题】:HashMap Performance when overriding hashcode method覆盖哈希码方法时的 HashMap 性能
【发布时间】:2014-04-08 14:11:12
【问题描述】:

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

如果我重写会发生什么 hashCode() 方法并实现它以将值作为 '1' 传递;会有任何性能影响吗?

如果我更改hashCode() 方法以使用Math.random() 函数返回随机值 性能会怎样?

【问题讨论】:

  • 试试看。但是,这只能是出于好奇,因为hashCode 不是任意的。
  • 如果您将hashCode() 方法更改为返回一个随机值,性能可能会做很多事情——但您的程序会完全崩溃,因为它不会再得到正确的结果。

标签: java dictionary collections


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    因为HashMap 使用hashCode 来计算在哈希表中使用哪个桶,如果您从hashCode 返回1,那么您实际上使HashMap 的性能类似于(未排序的)LinkedList'的表现。

    返回随机值只会炸毁您的 HashMap,因为 equal 对象将不再具有相等的 hashCodes。

    摘自Wikipedia

    +----------------------+----------+------------+----------+--------------+
    |                      |  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 中查找(它不再起作用)

    【讨论】:

    • 您在此处插入的表格的用途是什么?
    • 好的,我把不相关的部分删掉了。
    【解决方案3】:

    hashCode() 中总是返回1 会降低HashMap 的性能。每个对象默认为同一个桶,哈希表变成链表。根据Effective Java, item 9,你得到的是二次时间而不是线性时间。

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

    【讨论】:

    • 您对 Effective Java 中的那句话略有误解。平均而言,哈希访问是 O(1),而链表(或退化哈希表)的访问时间为 O(n)。因此,如果您有一个算法进行 n 次哈希访问,则其平均复杂度为 O(n)(因为 O(n) = O(n)· O(1)) 但 O(n²) 最坏情况复杂度。
    【解决方案4】:

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

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

    然后,确切的行为也将取决于 equals 方法的实现,但这些是此类实现的主要影响。

    【讨论】:

      【解决方案5】:

      在 hashcode() 中返回一个固定值肯定会让你的 hashtable 运行得更慢。所有值都将分配到同一个 bin,因此查找操作将花费线性时间(而不是具有良好哈希函数的平均恒定时间)。

      返回一个随机值将完全破坏 hashmap 合约。值将分配给随机箱并在随机箱中查找,因此无法保证您会找到以前存储的值。

      【讨论】:

        猜你喜欢
        • 2014-02-17
        • 1970-01-01
        • 1970-01-01
        • 2019-03-21
        • 2014-07-05
        • 2014-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多