Android中使用字符串作为SparseArray的键?

15

我需要在我的Android应用程序中使用hashmap来存储键/值(可能有数千个),但我知道为了节省内存应该使用SparseArray。不过,我的键需要是一个字符串。是否有方法创建SparseArray的自定义实现或其他替代方案?

4个回答

19
SparseArray只有在使用整数作为键时才适用。它是一种仅适用于整数值的内存优化,因为您需要对键执行二进制搜索。字符串上的二进制搜索很昂贵且不明确('1' 应该小于还是大于 'a' 或者 ‘疯狂的日语字符’?),所以不会使用它。
另外,SparseArray可以节省内存,但可能需要更长时间。HashMap上的 get 操作应该是 O(n/size),其中 size 是 hashmap 中桶的数量。SparseArray将是O(log(n))。要使用哪个取决于你需要的内存和速度。如果您拥有真正大量的条目(10万条),则甚至可能遇到内存分页问题,即使其技术上比 HashMap 更差,因为每次获取最多只有一个缓存未命中,而二进制搜索可能会有多个。

嗯,好的,有道理。当您需要以字符串为键时,最佳做法是什么?对于速度和内存来说,哈希映射是最有效的方式吗? - Mike6679
1
选择一个——内存或速度。你不能同时优化两者。如果需要速度,使用哈希映射。如果需要内存,则使用基于数组的数据结构、排序列表或二叉搜索树(这是许多数据库使用的方法,具有对数级别的搜索和O(n)内存的不错折衷方案)。但你无法同时优化两者。如果你认为这将成为痛点,请将其隔离在自己的类中,以便以后可以更改实现方式。 - Gabe Sechan
不使用HashMap在Android上处理成千上万的条目,是否可能引起“内存溢出异常”? - Mike6679
@GabeSechan 我只有字符串键.. 那我就不能使用SparseArray吗? - Ranjithkumar
不可以。你可以使用哈希映射代替。 - Gabe Sechan
显示剩余2条评论

7
您可以使用ArrayMap:ArrayMap是一种通用的键值映射数据结构,旨在比传统的HashMap更节省内存。
更多信息请参见:ArrayMap文档

5
您可以使用字符串的哈希码 -> mystring.hashCode()

1

SparseArray是一个专门为键类型为整数的映射而设计的类。它们基本上利用这个事实来保存int值,而不是对Integer对象的引用(因此节省了内存)。

当键是任何其他类型时,使用标准的HashMap没有任何固有的问题。


当使用字符串作为键来检索值时,是否使用HashMap是标准做法?原因如下:1.我需要存储数千甚至数百万条目;2.使用字符串作为键。在平衡内存和速度方面,绝对没有更好的方法吗? - Mike6679
@Mike 如果你的字符串可能有共同前缀,你可能想使用基数树。 - matiash

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