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 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个字节+(第一个元素大小)+(第二个元素大小)