我正在将传统设备中的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移植的,我担心这将占用多少内存在设备上。我可以做类似的事情,但存储在程序存储器中吗?
答案 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)
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项,除非你的字符串很长。