Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java没有';是否使用ArrayList类来实现Hashtable/HashMap类?_Java_Algorithm_Arraylist_Hashtable - Fatal编程技术网

为什么Java没有';是否使用ArrayList类来实现Hashtable/HashMap类?

为什么Java没有';是否使用ArrayList类来实现Hashtable/HashMap类?,java,algorithm,arraylist,hashtable,Java,Algorithm,Arraylist,Hashtable,该QA描述了哈希表是通过Java中的静态数组实现的(底层静态数组将根据项目的总数进行细化) 为什么Java不通过动态数组(比如ArrayList)实现哈希表 权衡是什么 调整基础数组的大小需要重新设置哈希表中的所有项的大小,这是一个非常昂贵的操作,并且会使数组中当前任何项的位置无效-这就是为什么每次项的数量超过某个阈值(负载因子)时,通常会将数组大小加倍。由于调整大小是在内部管理的,而且必须将现有项移动到新位置,因此像ArrayList这样的“可调整大小的数组”没有意义。调整哈希表的大小时,所有

该QA描述了哈希表是通过Java中的静态数组实现的(底层静态数组将根据项目的总数进行细化)

为什么Java不通过动态数组(比如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的解释。