当前位置: 首页 > 面试题库 >

SparseArray与HashMap

曹华荣
2023-03-14
问题内容

我可以想到以下几个原因,为什么HashMap带有整数键的SparseArrays 比s 要好得多:

  1. 的Android文档SparseArray说:“通常比传统的要慢HashMap”。
  2. 如果您使用HashMaps而不是SparseArrays 编写代码,那么您的代码将与Map的其他实现一起使用,并且将能够使用所有为Maps设计的Java API。
  3. 如果您使用HashMap而不是SparseArrays 编写代码,则您的代码将在非Android项目中运行。
  4. 地图会覆盖equals()hashCode()SparseArray不会覆盖。

但是,每当我尝试HashMap在Android项目中使用带有整数键的a 时,IntelliJ都会告诉我应该使用a
SparseArray代替。我觉得这真的很难理解。有谁知道使用SparseArrays的任何令人信服的理由?


问题答案:

SparseArrayHashMap当键是原始类型时可以用来替换。尽管不是所有的键/值类型都可以公开使用,但仍有一些变体。

好处是:

  • 免分配
  • 没有拳击

缺点:

  • 通常较慢,不适用于大型收藏
  • 他们将无法在非Android项目中使用

HashMap 可以替换为以下内容:

SparseArray          <Integer, Object>
SparseBooleanArray   <Integer, Boolean>
SparseIntArray       <Integer, Integer>
SparseLongArray      <Integer, Long>
LongSparseArray      <Long, Object>
LongSparseLongArray  <Long, Long>   //this is not a public class                                 
                                    //but can be copied from  Android source code

就内存而言,这是SparseIntArrayvs HashMap<Integer, Integer>代表1000个元素的示例:

SparseIntArray

class SparseIntArray {
    int[] keys;
    int[] values;
    int size;
}

类= 12 + 3 * 4 = 24字节
数组= 20 + 1000 * 4 = 4024字节
总计= 8,072字节

HashMap

class HashMap<K, V> {
    Entry<K, V>[] table;
    Entry<K, V> forNull;
    int size;
    int modCount;
    int threshold;
    Set<K> keys
    Set<Entry<K, V>> entries;
    Collection<V> values;
}

类= 12 + 8 * 4 = 48字节
条目= 32 + 16 + 16 = 64字节
数组= 20 + 1000 * 64 = 64024字节
总计= 64,136字节

资料来源:Romain Guy的Android Memories(来自幻灯片90)。

上面的数字是JVM在堆上分配的内存量(以字节为单位)。它们可能会有所不同,具体取决于所使用的JVM。

java.lang.instrument软件包包含一些用于高级操作的有用方法,例如,使用来检查对象的大小getObjectSize(Object objectToSize)

可从Oracle官方文档中获得更多信息。

类= 12个字节+(n个实例变量) 4个字节
数组= 20个字节+(n个元素)
(元素大小)
条目= 32个字节+(第一个元素大小)+(第二个元素大小)



 类似资料:
  • null 然而,每当我试图在Android项目中使用带有整数键的时,IntelliJ告诉我应该使用。我觉得这真的很难理解。有人知道使用s有什么令人信服的理由吗?

  • 问题内容: 有没有办法遍历Java SparseArray(适用于Android)?我曾经很容易通过索引来获取值。我找不到一个。 问题答案: 似乎我找到了解决方案。我没有正确注意到该功能。 因此,我将使用以下内容:

  • 本文向大家介绍Android中SparseArray性能优化的使用方法,包括了Android中SparseArray性能优化的使用方法的使用技巧和注意事项,需要的朋友参考一下 之前一篇文章研究完横向二级菜单,发现其中使用了SparseArray去替换HashMap的使用.于是乎自己查了一些相关资料,自己同时对性能进行了一些测试。首先先说一下SparseArray的原理.   SparseArray

  • 我需要用以下结构在我的自定义类“ArtistInfo”中实现parcelable: 下面是上述类中使用的“SongInfo”类的结构: 现在,正如您所看到的,在SongInfo类中实现Parcelable接口没有问题,但我无法理解如何分别在构造函数和writeToParcel方法中读取和写入AlbumInfo和SongSmap变量。有谁能帮我理解一下我该怎么去做那件事。谢谢!

  • 1.每当我在我的应用中刷下一张图片时,应用崩溃了,我不知道出了什么问题 noSuchMethodError:类landroid/util/sparsearray中没有包含(I)Z的虚拟方法;或其超类(“android.util.sparsearray”的声明出现在/system/framework/framework.jar!classes2.dex中) 此行应用程序崩溃

  • 问题内容: 我有一个Java类,将servlet属性设置为HashMap对象: 其中是HttpServletRequest对象,并返回HashMap对象。 有没有一种方法可以使用c:foreach或其他JSTL标签浏览HashMap集合? 我刚在想: 或者,如果无法完成,那么如何制作自定义标签来处理呢? 在我的JSP页面中诉诸Java代码是我的最后选择,我想知道JSTL是否可以实现。 谢谢,乔纳斯