原文地址:https://blog.csdn.net/u010687392/article/details/47809295
HashMap:
1、HashMap内部使用一个默认容量为16的数组来存储数据。
2、数组中的每一个元素又是另一个链表的头结点。
3、HashMap内部存储结构采用哈希表的拉链结构,叫做拉链法。
4、每一个节点->entry中包含的内容:
final K key;
V value;
final int hash;
HashMapEntry<K, V> next;
5、Entry 存储数据规则:通过key的hash值对HashMap数组的长度取余得到entry的存储位置,
计算公式为hash(key)%len,如果算出的结果重复 会直接以链表的形式连接在前一个entry的后面。
6、因为HashMap 默认存储大小就是一个容量为16的数组,所以创建HashMap就会分配一块内存给HashMap。
7、当HashMap的存储达到一定容量时,会自动扩容,扩容因子默认是0.75.
8、HashMap 扩容 需要不断的进行hash运算 对于android来说是很消耗资源的。
SparseArray:
1、SparseArray 比 HashMap更节省内存(主要原因是它避免了对key的自动装箱(int转为Integer类型))。
2、它的内部通过两个数组来进行存储数据,一个存储key一个存储value
private int[] mKeys;
private Object[] mValues;
3、内部对数据采取了压缩的方式表示稀疏数组。
4、存取和读取数据的时候采用二分法查找。
5、添加数据的时候 会采用二分查找法和之前的key比较大小,然后按照从小到大的顺序排好。
6、获取数据的时候也是采用二分法查找,而HashMap是通过遍历Entry【】来获取,速度比HashMap快。
7、由于添加 查找 删除 都会进行二分查找 所以对于数据量大的话 效果不明显。
8、适用场景:1、数据量小,最好千级以下
2、key值是int类型
ArrayMap
1、内部也是采用两个数组来存储,一个存储key的hash值 一个存储value值
2、也使用二分法对key进行排序,查找 删除 添加 也都是会进行二分查找
3、适用场景:1、数据量小,最好千级以下
2、key值是int类型