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 与 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 字节
来源:Android Memories by Romain Guy 来自幻灯片 90。
上面的数字是 JVM 在堆上分配的内存量(以字节为单位)。
它们可能因使用的特定 JVM 而异。
java.lang.instrument 包包含一些对高级操作有用的方法,例如使用getObjectSize(Object objectToSize) 检查对象的大小。
更多信息可从官方Oracle documentation获得。
类 = 12 字节 +(n 个实例变量)* 4 字节
数组 = 20 字节 +(n 个元素)*(元素大小)
条目 = 32 字节 +(第一个元素大小)+(第二个元素大小)