当我在Android中使用HashMap带有Integer键和数据值时,我在Eclipse中收到此消息:
Use new SparseIntArray(...) for better performance
Run Code Online (Sandbox Code Playgroud)
现在问题是SparseIntArray()没有实现Serializable接口而且不能getSerializable()和putSerializable()in 一起使用onRestoreInstanceState().
使用SparseIntArray()而不是使用有多重要HashMap<Integer, Integer>?
我应该经历制作SparseIntArray序列化的麻烦吗?(我的第一个想法是制作一个实现的包装类,Serializable这是正确的方法吗?)
Ste*_*n C 27
1)使用
SparseIntArray而不是使用有多重要HashMap?
这取决于你如何使用它.但除非你试图代表这样的许多和/或大型"阵列",否则差异可能不大.
请注意,Java SE没有任何稀疏数组类,通常不是问题.
2)我应该经历制作
SparseIntArray序列化的麻烦吗?(我的第一个想法是制作一个实现的包装类,Serializable这是正确的方法吗?)
见上文和下文.
实现一个包装听起来合理......如果你需要解决这个问题.另一种方法可能是声明一个可序列化的子类SparseIntArray.声明自定义readObject和writeObject方法是明智之举.
的SparseIntArray类(源代码)使用的一对int阵列来表示映射中的键和值,并使用二进制搜索做查找.按键保持顺序没有"孔",并使用二进制搜索执行查找.这意味着以下内容:
a的内存使用量SparseIntArray大约相当于等效值的10倍HashMap.这是由于以下因素的结合:
哈希表数组每个条目大约保存1个引用(取决于表的填充程度......),
键和值必须"装箱"为Integera HashMap,和中的对象
a中的每个条目都HashMap需要一个相当重的"节点"对象 - 标准实现中的4个字段.
(但是,如果Integer以正确的方式创建对象,则可以通过Integer类实例缓存的效果来减轻"装箱"开销.)
相比之下,稀疏版本需要2 * capacity4个字节的字.
将查找(即get)O(logN)与O(1)a 进行比较HashMap.
随机插入O(N)与O(1)a 进行比较HashMap.(这是因为插入必须平均移动现有条目的一半,以便可以将新条目添加到数组中的正确位置.)
顺序插入(即按键顺序升序)是O(1).
所以"哪个最好"显然取决于您的优化内容,如何使用数据结构,以及它将获得多大的数据.