14

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

4

4 回答 4

19

仅当整数是关键时,SparseArray 才有意义。这是一种内存优化,只有整数值才有可能,因为您需要对键进行二进制搜索。对字符串的二进制搜索很昂贵且定义不明确('1' 应该小于还是大于 'a' 或 'crazy Japanese character'?),所以他们不这样做。

顺便说一句,SparseArray 可以节省内存,但可能需要更多时间。HashMap 上的 get 应该是 O(n/size),其中 size 是 hashmap 中的桶数。SparseArray 将是 O(log(n))。使用哪个取决于您需要的内存和速度。如果你有一个非常大的(100Ks 条目),你甚至会遇到内存分页问题,​​缓存未命中的物理现实可能会导致更多的 HashMap 性能更好,即使它在技术上更糟,因为它最多有 1 个缓存Miss per get,而二分查找可能有多个。

于 2014-07-19T04:39:26.000 回答
7

您可以使用ArrayMap:ArrayMap 是一种通用的键-> 值映射数据结构,旨在比传统的 HashMap 更节省内存

更多信息:ArrayMap 文档

于 2015-09-11T06:48:24.043 回答
4

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

于 2017-06-18T07:36:03.567 回答
1

SparseArray是具有整数作为键类型的映射的专用类。他们基本上使用该事实来保存 int 值而不是对 Integer 对象的引用(因此节省了内存)。

HashMap当密钥是任何其他类型时,使用标准本身并没有错。

于 2014-07-19T04:38:09.957 回答