java - 使用 SparseIntArray 而不是 HashMap <Integer, Integer> 和 putSerializable

标签 java android

当我使用 HashMapInteger Android 中的键和数据值我在 Eclipse 中收到此消息:

Use new SparseIntArray(...) for better performance

现在的问题是SparseIntArray()没有实现 Serializable接口(interface),不能与 getSerializable() 一起使用和 putSerializable()onRestoreInstanceState() .

  1. 使用 SparseIntArray() 有多重要而不是 HashMap<Integer, Integer>

  2. 我是否应该麻烦制作 SparseIntArray可序列化? (我的第一个想法是制作一个实现 Serializable 的包装类,这是正确的方法吗?)

最佳答案

1) How important is using SparseIntArray instead of the HashMap ?

这取决于你如何使用它。但除非您尝试像这样表示许多和/或大型“数组”,否则差异不太可能很大。

请注意,Java SE 没有任何稀疏数组类,这通常不是问题。

2) Should I go through the trouble of making SparseIntArray serializable? (My first idea is making a wrapper class that implements Serializable, is this the right way to go?)

见上文和下文。

实现包装器听起来很合理……如果您需要解决这个问题。另一种方法可能是声明 SparseIntArray 的可序列化子类。 .建议声明自定义 readObjectwriteObject方法。


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/

相关文章:

java - 参数、 setter 和 getter

java - 代码模型 : how to check if I need to generate a generic type?

java - 如何设置EditText线条的粗细?

android - Samsung Galaxy S3 上的 TTS 问题

android - 如何将表格布局垂直分成相等的部分?

java - 有没有更快的方法从对象集合中提取唯一值?

java - 混合读取的gson

android - 需要建议新的 AsyncTask 递归调用

android - startActivityForResult 一位联系人的所有电话号码

android - 如何从 Activity 的包含类启动结果 Intent (startActivityForResult)