【问题标题】:Why Java doesn't use ArrayList class to implement Hashtable/HashMap class?为什么Java不使用ArrayList类来实现Hashtable/HashMap类?
【发布时间】:2012-03-10 23:03:44
【问题描述】:

这个QAHow does Java implement hash tables?描述了Hashtable是通过Java中的静态数组实现的(底层静态数组会根据项目总数细化)。

为什么Java不通过动态数组实现Hashtable,比如ArrayList?

什么是权衡?

【问题讨论】:

    标签: java algorithm arraylist hashtable


    【解决方案1】:

    调整底层数组的大小需要重新散列哈希表中的所有项目,这是一项非常昂贵的操作,并且会使当前在数组中的任何项目的位置无效 - 这就是为什么每次项目数量超过某个阈值时通常将数组大小加倍的原因(负载系数)。由于调整大小是在内部管理的,并且现有的项目必须移动到一个新位置,所以像 ArrayList 这样的“可调整大小的数组”是没有意义的。

    【讨论】:

      【解决方案2】:

      调整哈希表的大小时,需要重新定位所有条目。
      因此,使用 ArrayList 会更慢,因为 ArrayList 会在 HashTable 重新计算所有旧值之前复制现在无用的旧值。

      【讨论】:

      • 你的意思是这样的:假设一个 Hashtable 有 {1, "a"} (为简单起见,1 是键的槽索引,而不是键)。现在 Hashtable 需要扩展,因此需要将 {1, "a"} 重新散列到 {10, "a"},这意味着需要将这对从索引 1 复制到索引 10。ArrayList 在复制,至少比静态原始数组效率低,所以使用 ArrayList 没有意义。你是这个意思吗?
      • 没有。我的观点是调整 ArrayList 的大小会将原始数据复制到新的支持数组。 HashTable 不希望这样。
      • 但是ArrayList是一个动态数组,为什么需要resize呢?
      • ArrayList 是使用具有默认长度(10 或类似长度)的简单数组实现的。当您向 ArrayList 添加足够的项目时,它会创建一个新数组,大小是旧数组的两倍,并将旧数组复制到新数组中。所以它是动态的,但是任何给定时间的内存分配都是固定的。
      • @JacksonTale:没有“动态数组”这样的东西。请参阅 Matthew 的解释。
      【解决方案3】:

      实现类非常不透明。由于ArrayList 与真正的静态数组相比效率相当低,因此无需使用它。

      您不会有任何好处,至少通过这种方式您可以节省包含哈希映射的静态数组的包装器。

      调整ArrayList 的大小就像调整HashMap 的大小一样,因为它们都使用静态底层数组,但无论如何您都需要重新散列地图的所有元素,因此实际上没有必要使用它.

      【讨论】:

        猜你喜欢
        • 2012-03-10
        • 1970-01-01
        • 2017-05-18
        • 1970-01-01
        • 2010-10-02
        • 1970-01-01
        • 1970-01-01
        • 2016-07-18
        • 1970-01-01
        相关资源
        最近更新 更多