0

我正在将旧设备中的 16 位代码转换为表定义的字符串。代码有2000多个,代码不连续。

它们目前在这样的 HashMap 中定义......

public class SomeActivity {
    private static final Map<Integer, String> myMap;
    static {
        Map<Integer, String> aMap = ...;
        aMap.put(0x2345, "this");
        aMap.put(0xFEA3, "that");
        ...
        myMap = Collections.unmodifiableMap(aMap);
    }
}

这是为 android 移植的,我担心这将在设备上使用多少 RAM。我可以做类似的事情,但存储在程序内存中吗?

4

2 回答 2

2

代码可能不是连续的,但如果它们相当密集(即存在之间的数字的可能性min(keys)很高max(keys),比如超过 75%),您可以通过预先构建一个String[]大小的对象max(keys)-min(keys)并使用它来节省一些空间像一张地图。

如果它是可用的/Android 开发的一个选项,原始地图和其他数据结构的另一个很好的替代方案是Trove 库,它同样可以在使用原始数据结构时为您节省大量空间和时间。

或者,由于您调用Collections.unmodifiableMap()考虑 Guava's ImmutableMap- 它不如 Trove 高效,它避免了自动装箱原语,但它比 Java 的标准 HashMap 更高效(虽然速度稍慢)。

也就是说,就像评论所暗示的那样,你很可能什么都不担心。一如既往,“过早的优化是万恶之源”。很可能一个简单的 Java HashMap 就可以很好地为您服务。

于 2013-05-02T18:56:44.890 回答
1

A SparseArray( http://developer.android.com/reference/android/util/SparseArray.html ) 比基本的 HashMap 更合适。

您也可以将其放入您放入程序资产的属性文件(请参阅http://developer.android.com/reference/java/util/Properties.html )中(您仍然必须将所有文件加载到内存读取 1 个值)

您甚至可以预先制作一个 sqlite 数据库,然后从您的资产中复制它(请参阅http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/)。在这种情况下,值在文件中,并且只加载所需的元素。

但是,除非您的字符串很长,否则我不会担心 RAM 中有 2000 个项目。

于 2013-05-03T14:06:53.993 回答