Cra*_*lus 3 java optimization hashtable hashmap data-structures
我通常会这样做
HashMap<String,String> dictionary = new HashMap<String,String>();
Run Code Online (Sandbox Code Playgroud)
我开始考虑它,据我所知HashMap,通过哈希表在引擎盖下实现.
使用哈希将对象存储在表中,以查找它们应存储在表中的位置.
我没有在构造上设置尺寸这一事实是否会dictionary降低性能?
即建设期间哈希表的大小是多少?当元素增加时,是否需要为表分配新内存?
或者我对这里的概念感到困惑?
默认容量和负载是否足够,或者我应该花时间查看实际数字?
我没有在字典构造上设置大小的事实是否会降低性能?
取决于你将要存储HashMap多少以及之后代码将如何使用它.如果你可以预先给它一个大概的数字,它可能会更快,但是:"如果迭代性能很重要,那么将初始容量设置得太高是非常重要的" 1因为迭代时间与容量成正比.
在非性能关键的代码片段中执行此操作将被视为过早优化.如果您要超越JDK作者,请确保您的测量结果表明您的优化非常重要.
在构造期间哈希表的大小是多少?
根据API文档,16.
当元素增加时,是否需要为表分配新内存?
是.每次它比负载因子(默认值= .75)更充分时,它会重新分配.
默认容量和负载是否足够
只有你可以告诉.描述您的计划,看看它是否花费了太多时间HashMap.put.如果不是,请不要打扰.
Java 的好处在于它是开源的,因此您可以获取源代码,它回答了许多问题:
HashMap不,和之间没有关系HashTable。 HashMap派生自AbstractMap,并且不在内部使用 aHashTable来管理数据。
忽略显式大小是否会降低性能将取决于您的使用模型(或更具体地说,您在地图中放入了多少内容)。每次达到某个阈值(0.75 * )时,地图的大小就会自动加倍<current map capacity>,并且加倍操作的成本很高。因此,如果您知道大约有多少元素将进入映射,您可以指定一个大小并防止它需要分配额外的空间。
如果没有使用构造函数指定,则映射的默认容量为 16。因此,当第 12 个元素添加到映射中时,映射的容量将加倍至 32。然后24日再次,依此类推。
是的,当容量增加时,需要分配新的内存。这是一个相当昂贵的操作(请参阅resize()和transfer()函数)。
与您的问题无关,但仍然值得注意,我建议声明/实例化您的地图,如下所示:
Map<String,String> dictionary = new HashMap<String,String>();
Run Code Online (Sandbox Code Playgroud)
...当然,如果您碰巧知道地图中将放置多少个元素,您也应该指定它。