我有大量的实习字符串(具有少量可能的值,因此实际上是有意义的)我想要存储在Map
中(用作计数器)。
TreeMap
在树的每个级别进行比较,我想这将涉及字符的O(n)比较。 HashMap
将使用哈希进行存储。
鉴于我有一小部分实习字符串,这意味着引用可用于相等或排序比较(因此既不需要使用哈希码也不需要使用值),我想知道是否有一个很好的 - 结构?
(或者确实是一种更适合计算的专业)
我的优先事项是速度和紧凑的表示(我处理大量数据)。
(为了阻止任何"过早优化"评论,我处理了大约2亿件物品。)
答案 0 :(得分:3)
java.util.IdentityHashMap
与HashMap
类的工作方式类似,但使用标识相等==
和哈希码(System.identityHashCode
)来比较键。它还具有更小的内存占用,因为它只使用单个数组来存储键和值。尽管==
的速度与native
一样快,但System.identityHashCode(Object)
方法有一个HashMap
实现,它带来了一些开销(但它可能是一个JVM内在的)。
HashEntry
实现虽然需要更多内存(String.equals
s),但应该具有类似的哈希代码计算和相等性检查性能。这是因为String.hashCode
方法首先检查引用相等,并且为每个String缓存HashMap
。在“紧急”中,{{1}}方法也会为非缓存字符串生成正确的结果。在可维护性方面,这可能是更好的选择。