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;
}
Class = 12 + 8 * 4 = 48 字节
Entry = 32 + 16 + 16 = 64 字节
Array = 20 + 1000 * 64 = 64024 字节
Total = 64,136 字节
来源:Romain Guy 的《Android Memories》第 90 张幻灯片。
以上数字表示 JVM 在堆上分配的内存量(以字节为单位)。具体取决于所使用的 JVM。
java.lang.instrument
包中包含一些有用的方法,如使用 getObjectSize(Object objectToSize)
检查对象大小等高级操作。
更多信息可以在官方 Oracle 文档 中找到。
Class = 12 字节 + (n 个实例变量)* 4 字节
Array = 20 字节 + (n 元素)*(元素大小)
Entry = 32 字节 + (第一个元素大小)+ (第二个元素大小)