实际差异TreeMap和ArrayMap

时间:2019-05-06 17:18:35

标签: android dictionary data-structures

在Java中,TreeMap用于保留键排序的字典。 在android上,ArrayMap用作“内存有效”的HashMap,其中(我推断)键保持排序,因为

  

查找需要二进制搜索,添加和删除需要在数组中插入和删除条目

内存使用情况:

  

...此容器旨在更好地平衡内存使用...

     

它将映射保留在数组数据结构中-每个项目的哈希码的整数数组,以及键/值对的Object数组。这样可以避免必须为放置到地图中的每个条目创建一个额外的对象。

     

...当从其中删除项目时,它将缩小其数组...

我们可以合理地得出结论,ArrayMap不适合容纳约1000多种物品:

  

对于最多容纳数百个物品的容器,性能差异并不明显,小于50%。

     

请注意,此实现不适用于可能包含大量项目的数据结构。

一般来说,使用一项与另一项相比会有哪些额外的成本/收益?

  1. Android的ArrayMap实现线程安全(因此速度较慢)吗?
  2. 有没有办法影响ArrayMap中的排序?
  3. 番石榴中是否有类似的数据结构?
  4. 等。

1 个答案:

答案 0 :(得分:1)

  1. 如文档中所述,ArrayMap不是线程安全的。
  2. 排序始终是通过键哈希码的升序进行的。您可以通过在键类的实现中重写hashCode()来控制顺序。小心碰撞。

ArrayMap允许像ArrayList一样直接通过索引访问其键和值,并且可以非常有效地对其进行迭代。 ArrayMap的内存消耗最小。两者都具有O(log n)的检索复杂度。理论上,插入和删除对于ArrayMap来说要慢一些,因为它们类似于在ArrayList的中间插入或删除元素:从技术上讲,它是O(n),但它使用对System.arrayCopy()的单个调用来移动所有值马上很快。因此,如果您需要经常修改地图,则ArrayMap可能不是最佳选择,但在所有其他用例中,它都非常有能力。