没有确切的答案:哪个Java Map最便宜?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了没有确切的答案:哪个Java Map最便宜?相关的知识,希望对你有一定的参考价值。
以前可能有人问过,但是我一次又一次地遇到这种情况,我想存储很少的一些属性,我绝对确定这些属性永远不会超过20个密钥。使用HashMap似乎完全浪费了CPU和内存,而所有开销都从此开始,而且在为每个键查找计算高级哈希值时,性能也很差。如果只有少于20个键(大多数情况下可能更像5个键)。我绝对可以确定,计算哈希值比迭代和比较需要的时间多一百倍……不?
这里有关于过早优化的讨论,但是我在这里并不完全同意。我主要在android上使用,任何额外的CPU /内存都会为其他内容选择更多功能。不一定在这里谈论消费市场。这里的用例定义非常明确,而且变化不大。万一(永远不会发生的事情)用HashMap替换非常便宜的地图将是微不足道的(突然发生)。
所以,我的问题是;这是我可以在Java中使用的最便宜,最基本的Map?
no!不会有显着的内存开销,因为据我所知,HashMap
由16个存储桶初始化,然后每次刷新时其大小都会加倍,因此在最坏的情况下,您的地图会有超过12个存储分区,因此这没什么大不了的。
O(n)
个元素更好(即使n <20)。 HashMap
的唯一背景是未排序,但是就我而言,当我对顺序没有特殊要求时,我认为它是Java中的默认Map
实现。总结:使用HashMap
!
hashCode()
计算时间,请考虑缓存计算的值,例如java.lang.String
。有关此问题,请参见how caching hashcode works in Java as suggested by Joshua Bloch in effective java?问题。Map
的性能。更重要的是考虑并发,迭代顺序和空值的需求。但是,既然您问了,这就是我的具体答案。EnumMap
如果键是enums,则最快的Map
实现将是EnumMap
。
基于表示枚举对象域的位图,EnumMap
的执行速度非常快,而占用的内存却很少。
EnumMap
如果您真的非常关心性能,请考虑使用IdentityHashMap
。
IdentityHashMap
的此实现使用引用相等而不是对象相等。尽管仍然涉及哈希值,但它是内存中对象地址的哈希值(可以这么说,在Java中我们没有直接的内存访问权限)。因此,完全避免了可能对每个关键对象自己的IdentityHashMap
方法进行冗长的调用。因此,性能可能会比Map
好。您将看到基本操作(hashCode
和hashCode
)的恒定时间性能。
仔细研究文档,以了解是否要采用这种方法。请注意关于
linear-probe与chaining的讨论,以获得更好的性能。请注意,此类在比较对象时会部分违反HashMap
合同,该合同要求使用HashMap
方法。而且此映射不提供并发性。
这里是我用来帮助比较与Java 11捆绑在一起的各种
get
实现的表。put
以上是关于没有确切的答案:哪个Java Map最便宜?的主要内容,如果未能解决你的问题,请参考以下文章
[原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map(代码片