我通常这样做,例如
HashMap<String,String> dictionary = new HashMap<String,String>();
我开始考虑它,据我所知,HashMap
是通过哈希表在后台实现的。
对象存储在表中,使用散列来查找它们应该存储在表中的位置。
我没有为 dictionary
的构造设置大小是否会降低性能?
IE。构造期间哈希表的大小是多少?随着元素的增加,是否需要为表分配新的内存?
或者我对这里的概念感到困惑?
默认容量和负载是否足够,或者我应该花时间了解实际数字?
最佳答案
Java 的优点在于它是开源的,因此您可以打开 source code ,它回答了一些问题:
不,
HashMap
之间没有关系和HashTable
.HashMap
源自AbstractMap
, 并且不在内部使用HashTable
用于管理数据。省略显式大小是否会降低性能将取决于您的使用模型(或者更具体地说,您在 map 中放入了多少东西)。每次达到某个阈值 (0.75 *
<current map capacity>
) 时, map 的大小都会自动加倍,加倍操作的代价很高。因此,如果您知道大约有多少元素将进入 map ,您可以指定一个大小并防止它永远需要分配额外的空间。map 的默认容量(如果未使用构造函数指定)为 16。因此,当第 12 个元素添加到 map 时,它的容量将翻倍至 32。然后在 24 日再次出现,以此类推。
是的,当容量增加时需要分配新的内存。而且这是一项相当昂贵的操作(请参阅
resize()
和transfer()
函数)。
与您的问题无关但仍值得注意的是,我建议像这样声明/实例化您的 map :
Map<String,String> dictionary = new HashMap<String,String>();
...当然,如果您碰巧知道 map 中将放置多少元素,您也应该指定。
关于java - 初始化 HashMap 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7544691/