我可以想到以下几个原因,为什么HashMap
带有整数键的SparseArray
s 比s 要好得多:
SparseArray
说:“通常比传统的要慢HashMap
”。HashMap
s而不是SparseArray
s 编写代码,那么您的代码将与Map的其他实现一起使用,并且将能够使用所有为Maps设计的Java API。HashMap
而不是SparseArray
s 编写代码,则您的代码将在非Android项目中运行。equals()
,hashCode()
而SparseArray
不会覆盖。但是,每当我尝试HashMap
在Android项目中使用带有整数键的a 时,IntelliJ都会告诉我应该使用a
SparseArray
代替。我觉得这真的很难理解。有谁知道使用SparseArray
s的任何令人信服的理由?
SparseArray
HashMap
当键是原始类型时可以用来替换。尽管不是所有的键/值类型都可以公开使用,但仍有一些变体。
好处是:
缺点:
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
就内存而言,这是SparseIntArray
vs 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是否可以实现。 谢谢,乔纳斯