何时使用Android的ArrayMap而不是HashMap?

12

Android有自己实现的HashMap,不使用自动装箱,对于性能(CPU或RAM)来说更好一些?

https://developer.android.com/reference/android/support/v4/util/ArrayMap.html

根据我在这里读到的,如果我有HashMap对象,其大小低于数百个记录并且将频繁写入,则应该使用ArrayMap对象替换它们。如果它们将包含数百个对象并且只会被写入一次并经常读取,则没有替换HashMaps为ArrayMaps的必要。我的理解是否正确?


“不使用自动装箱”,你在哪里读到的? - Blackbelt
它将其映射保留在数组数据结构中--每个项目的哈希码的整数数组和键/值对的对象数组。这使它避免了为放入地图中的每个条目创建额外的对象。 - Kaloyan Roussev
ArrayMap 存储对象引用作为键和值,因此不会防止装箱。与 SparseArray 类不同的是,SparseArray 类可以通过存储基本类型来防止键和/或值的装箱。文档说明的是,与 HashMap 类相比,ArrayMap 不会为每个键值对创建任何“Map.Entry”中间对象。 - BladeCoder
请注意,ArrayMap 不是 Serializable - user4035628
3个回答

14

您应该观看这个视频:https://www.youtube.com/watch?v=ORgucLTtTDI
完美的情况:
1. 对于小量物品(<1000),访问频繁或插入和删除不太频繁,因此执行这些操作的开销并不明显。
2. 地图容器——地图的地图,其中子地图往往具有较少数量的项目,并且经常迭代它们。


6

相对于HashMap,ArrayMap使用的内存要少得多,特别是针对最多几百个项目的情况,尤其是如果地图不经常更新的话,建议使用ArrayMap。花费更少的时间分配和释放内存也可能提供一些普遍的性能收益。

由于任何插入都需要数组复制,因此更新性能略逊一筹。对于少量项目,读取性能可比,并使用二分查找。


5

你尝试进行这样的替换有什么原因吗?

如果是为了提高性能,那么您需要在替换之前和之后采取措施,并查看替换是否有帮助。

可能并不值得这个努力。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接