稀疏数组
可用于在键是基元类型时替换 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
在内存方面,以下是1000个元素的vs示例:SparseIntArray
HashMap<Integer, Integer>
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 字节 + (第 1 个元素大小) + (第 2 个元素大小)