程序存储器Java中的大型静态映射

时间:2013-05-02 18:28:19

标签: java android memory collections map

我正在将传统设备中的16位代码转换为表格定义的字符串。有超过2,000个代码,代码不连续。

它们目前在像这样的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移植的,我担心这将占用多少内存在设备上。我可以做类似的事情,但存储在程序存储器中吗?

2 个答案:

答案 0 :(得分:2)

代码可能不是连续的,但如果它们相当密集(即min(keys)max(keys)之间的数字存在的可能性很高,比如超过75%),您可能可以保存通过预先构建大小为String[]的{​​{1}}对象并将其用作地图来构建一些空间。

如果它可用/是Android开发的一个选项,原始地图和其他数据结构的另一个很好的选择是Trove library,它可以类似地在处理原始数据结构时节省大量的空间和时间。

或者,因为你调用max(keys)-min(keys)考虑Guava的ImmutableMap - 它不像Trove那样有效,它避免了自动装箱原语,但它比Java的标准HashMap({{3}更高效。 })。

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

答案 1 :(得分:1)

SparseArrayhttp://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项,除非你的字符串很长。