为什么Java不使用ArrayList类来实现Hashtable/HashMap类?

3

这个如何实现Java哈希表的问答描述了Java中Hashtable是通过静态数组实现的(基础静态数组将根据项目总数进行细化)。

为什么Java不使用动态数组(例如ArrayList)来实现Hashtable?

这样做有什么权衡之处?

3个回答

4

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


那么你的意思是:假设一个Hashtable有{1,“a”}(1是键的槽索引,而不是键,为了简单起见)。现在Hashtable需要扩展,因此它需要将{1,“a”}重新散列到{10,“a”},这意味着需要将该对从索引1复制到索引10。ArrayList在复制方面并不那么高效,至少比静态原始数组低效,因此使用ArrayList没有意义。你是这个意思吗? - Jackson Tale
不。我的观点是,调整大小 ArrayList 会将原始数据复制到新的支持数组中。HashTable 不希望这样做。 - SLaks
但是ArrayList是动态数组,为什么它需要被调整大小? - Jackson Tale
1
ArrayList是使用简单的数组实现的,默认长度为10或类似值。当您向ArrayList添加足够的项时,它会创建一个新的数组,大小是旧数组的两倍,并将旧数组复制到新数组中。因此,它是动态的,但在任何给定时间内的内存分配是固定的。 - Matthew Flynn
@JacksonTale:并不存在所谓的“动态数组”。请参考Matthew的解释。 - SLaks
@MatthewFlynn,收到,我现在明白了。 - Jackson Tale

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

0

实现类相当不透明。由于与真正的静态数组相比,ArrayList相当低效,因此没有必要使用它。

你不会有任何好处,至少这样可以避免使用包含哈希映射的静态数组的包装器。

调整ArrayList的大小就像调整HashMap一样,因为它们都使用静态底层数组,但是你需要重新散列映射的所有元素,所以真的没有必要使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接