java - 初始化 HashMap 的最佳方式

标签 java optimization data-structures hashmap hashtable

我通常这样做,例如

HashMap<String,String> dictionary = new HashMap<String,String>();

我开始考虑它,据我所知,HashMap 是通过哈希表在后台实现的。
对象存储在表中,使用散列来查找它们应该存储在表中的位置。

我没有为 dictionary 的构造设置大小是否会降低性能?
IE。构造期间哈希表的大小是多少?随着元素的增加,是否需要为表分配新的内存?
或者我对这里的概念感到困惑?
默认容量和负载是否足够,或者我应该花时间了解实际数字?

最佳答案

Java 的优点在于它是开源的,因此您可以打开 source code ,它回答了一些问题:

  1. 不,HashMap之间没有关系和 HashTable . HashMap源自 AbstractMap , 并且不在内部使用 HashTable用于管理数据。

  2. 省略显式大小是否会降低性能将取决于您的使用模型(或者更具体地说,您在 map 中放入了多少东西)。每次达到某个阈值 (0.75 * <current map capacity> ) 时, map 的大小都会自动加倍,加倍操作的代价很高。因此,如果您知道大约有多少元素将进入 map ,您可以指定一个大小并防止它永远需要分配额外的空间。

  3. map 的默认容量(如果未使用构造函数指定)为 16。因此,当第 12 个元素添加到 map 时,它的容量将翻倍至 32。然后在 24 日再次出现,以此类推。

  4. 是的,当容量增加时需要分配新的内存。而且这是一项相当昂贵的操作(请参阅 resize()transfer() 函数)。

与您的问题无关但仍值得注意的是,我建议像这样声明/实例化您的 map :

Map<String,String> dictionary = new HashMap<String,String>();

...当然,如果您碰巧知道 map 中将放置多少元素,您也应该指定。

关于java - 初始化 HashMap 的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7544691/

相关文章:

java - 比较 ArrayList 中的 float

java - 线程 "main"com.sun.jersey.api.client.ClientHandlerException : java.net.ConnectException 中出现异常:连接被拒绝:连接

java - 无法使用 Linux 打开 JNLP 文件?

javascript - 如何将值传递给javascript函数的参数并获取结果

针对大量类实例的 C# 优化

sql - EF4.2 额外的左外连接到同一个表

c++ - C++-代码优化

c - 如何实现具有惰性传播的线段树?

.net - 最快的搜索技术/方法是什么? (在文件搜索的上下文中)

algorithm - 在 O(n)(时间和空间)中对两个数组进行排序