为什么Java没有';是否使用ArrayList类来实现Hashtable/HashMap类?
该QA描述了哈希表是通过Java中的静态数组实现的(底层静态数组将根据项目的总数进行细化) 为什么Java不通过动态数组(比如ArrayList)实现哈希表为什么Java没有';是否使用ArrayList类来实现Hashtable/HashMap类?,java,algorithm,arraylist,hashtable,Java,Algorithm,Arraylist,Hashtable,该QA描述了哈希表是通过Java中的静态数组实现的(底层静态数组将根据项目的总数进行细化) 为什么Java不通过动态数组(比如ArrayList)实现哈希表 权衡是什么 调整基础数组的大小需要重新设置哈希表中的所有项的大小,这是一个非常昂贵的操作,并且会使数组中当前任何项的位置无效-这就是为什么每次项的数量超过某个阈值(负载因子)时,通常会将数组大小加倍。由于调整大小是在内部管理的,而且必须将现有项移动到新位置,因此像ArrayList这样的“可调整大小的数组”没有意义。调整哈希表的大小时,所有
权衡是什么 调整基础数组的大小需要重新设置哈希表中的所有项的大小,这是一个非常昂贵的操作,并且会使数组中当前任何项的位置无效-这就是为什么每次项的数量超过某个阈值(负载因子)时,通常会将数组大小加倍。由于调整大小是在内部管理的,而且必须将现有项移动到新位置,因此像ArrayList这样的“可调整大小的数组”没有意义。调整哈希表的大小时,所有条目都需要重新定位。
因此,使用ArrayList的速度会较慢,因为ArrayList会在哈希表重新计算之前复制现在无用的旧值 实现类非常不透明。由于与真正的静态数组相比,
ArrayList
效率很低,因此没有必要使用它
您不会有任何好处,至少通过这种方式,您可以节省对包含哈希映射的静态数组的包装
调整
ArrayList
的大小就像调整HashMap
的大小一样,因为它们都可以使用静态的底层数组,但是在任何情况下都需要重新调整映射的所有元素,所以实际上没有必要使用它。那么你的意思是:假设一个哈希表有{1,“a”}(为了简单起见,1是键的槽索引,而不是键)。现在哈希表需要扩展,所以它需要将{1,“a”}重新设置为{10,“a”},这意味着该对需要从索引1复制到索引10。ArrayList的复制效率不高,至少比静态原始数组低,所以使用ArrayList毫无意义。你是说这个吗?不。我的观点是,调整ArrayList的大小会将原始数据复制到新的备份数组。哈希表不希望这样。但是ArrayListArrayList是一个动态数组,为什么需要调整它的大小?ArrayList是使用一个具有默认长度(10或类似长度)的简单数组实现的。当您向ArrayList中添加足够的项时,它会创建一个新数组,大小是旧数组的两倍,并将旧数组复制到新数组中。因此,它是动态的,但在任何给定时间的内存分配都是固定的。@JacksonTale:没有“动态数组”这种东西。请参阅Matthew的解释。