SparseArray
HashMap当键是原始类型时可以用来替换。尽管不是所有的键/值类型都可以公开使用,但仍有一些变体。
好处是:
- 免分配
- 没有拳击
缺点:
- 通常较慢,不适用于大型收藏
- 他们将无法在非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 pre
就内存而言,这是
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(ObjectobjectToSize)。
可从Oracle官方文档中获得更多信息。
类= 12个字节+(n个实例变量) 4个字节
数组= 20个字节+(n个元素)(元素大小)
条目= 32个字节+(第一个元素大小)+(第二个元素大小)



