然而,每当我试图在Android项目中使用带有整数键的HashMap
时,IntelliJ告诉我应该使用SparSearRay
。我觉得这真的很难理解。有人知道使用sparsearray
s有什么令人信服的理由吗?
当键为基元类型时,SparSearRay
可用于替换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
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字节
java.lang.instrument
包包含一些有用的高级操作方法,比如使用GetObjectSize(objectToSize)
检查对象的大小。
更多信息可从官方的Oracle文档中获得。
类=12字节+(n个实例变量)*4字节
数组=20字节+(n个元素)*(元素大小)
条目=32字节+(第一个元素大小)+(第二个元素大小)