当我使用 HashMap
用Integer
Android 中的键和数据值我在 Eclipse 中收到此消息:
Use new SparseIntArray(...) for better performance
现在的问题是SparseIntArray()
没有实现 Serializable
接口(interface),不能与 getSerializable()
一起使用和 putSerializable()
在 onRestoreInstanceState()
.
使用
SparseIntArray()
有多重要而不是HashMap<Integer, Integer>
?我是否应该麻烦制作
SparseIntArray
可序列化? (我的第一个想法是制作一个实现Serializable
的包装类,这是正确的方法吗?)
最佳答案
1) How important is using
SparseIntArray
instead of theHashMap
?
这取决于你如何使用它。但除非您尝试像这样表示许多和/或大型“数组”,否则差异不太可能很大。
请注意,Java SE 没有任何稀疏数组类,这通常不是问题。
2) Should I go through the trouble of making
SparseIntArray
serializable? (My first idea is making a wrapper class that implementsSerializable
, is this the right way to go?)
见上文和下文。
实现包装器听起来很合理……如果您需要解决这个问题。另一种方法可能是声明 SparseIntArray
的可序列化子类。 .建议声明自定义 readObject
和 writeObject
方法。
SparseIntArray
类 ( source code ) 使用一对 int
数组来表示映射中的键和值,并使用二进制搜索来进行查找。 key 按顺序保存,没有“漏洞”,并且使用二进制搜索执行查找。这意味着:
SparseIntArray
的内存使用情况将大约是等效HashMap
的 10 倍.这是由于多种因素的结合:散列表数组的每个条目大约包含 1 个引用(取决于表有多满...),
键和值必须“装箱”为
Integer
HashMap
中的对象, 和HashMap
中的每个条目需要一个相当重的“节点”对象——标准实现中有 4 个字段。
(但是,如果您以正确的方式创建
Integer
对象,则可以通过Integer
类实例缓存的效果减轻“装箱”开销。)相比之下,稀疏版本需要
2 * capacity
4 字节字。查找(即
get
)是O(logN)
与O(1)
相比对于HashMap
.随机插入的是
O(N)
与O(1)
相比对于HashMap
. (这是因为插入必须平均移动现有条目的一半,以便新条目可以添加到数组中的正确位置。)顺序插入(即按键顺序升序)是
O(1)
.
因此,“哪个最好”显然取决于您要优化的内容、您如何使用数据结构以及它将变得有多大。
关于java - 使用 SparseIntArray 而不是 HashMap <Integer, Integer> 和 putSerializable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17078395/