【发布时间】:2011-11-24 13:45:32
【问题描述】:
我通常会这样做
HashMap<String,String> dictionary = new HashMap<String,String>();
我开始考虑它,据我所知,HashMap 是通过哈希表在后台实现的。
使用散列将对象存储在表中以查找它们应存储在表中的位置。
我没有对dictionary 的构造设置大小这一事实是否会降低性能?
IE。构建期间哈希表的大小是多少?随着元素的增加,是否需要为表分配新的内存?
还是我对这里的概念感到困惑?
默认容量和负载是否足够,或者我应该花时间了解实际数字吗?
【问题讨论】:
-
不是基于
java.util.Hashtable(同步的),而是基于哈希表。 -
@EJP:不要相信所有书面阅读,但read the source。 Java 的
HashMap是一个非常简单的链式哈希表实现,看不到树。 -
@EJP,链式桶的结构是一棵树,而不是二叉树、b-tree 或 spline,但仍然是一棵树。至于抱怨:你在 put 上有分配,在 get 上有更差的局部性(间接,即缓存未命中),在碰撞上有额外的间接。例如(只是快速谷歌)Zukowski 等人的一项研究 [4]已经表明,对于现代处理器上的小型缓存驻留哈希表,布谷鸟哈希比链式哈希要快得多。 en.wikipedia.org/wiki/… Impl。 IdentityHashMap的就是java中通用的HT应该是什么。内存占用少,速度快。
-
@bestsss:将列表称为树在病态意义上是正确的,并且非常令人困惑。将列表列表称为树也是如此。 OTOH,我可以想象
HashMap不是非常快或内存效率不是很高,因为它确实做了很多分配。 -
@larsmans 这不是一个列表,它是一个链表数组。这是我记得很多年前我读到的关于哈希表的第一个名称(基于树的)。 Knuth 确实将其称为链式。如今(10 多年)硬件线性探测器的 2 次幂可能会产生最佳性能和内存占用。 (可能与素数长度表相媲美,但它需要 mod(~30 个时钟)而不是右移(1 个时钟)来获得索引)
标签: java optimization data-structures hashmap hashtable