HashMap,SparseArray,ArrayMap三者之间

Android为我们提供了比HashMap内存效率更高的键值对数据结构SparseArray和ArrayMap,今天来说说为什么要使用SparseArray和ArrayMap来替代HashMap.
HashMap的数据结构特点是维护一个默认大小为16的数组用于存储,这个每个数组存放这个

class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next;
}

注意Node<K,V> next; 意味着它并不单单只是存放一个对象,它存放的是一个链表。
我们通过计算key的hash值,然后用hash值除以数组长度取余数,通过这个余数决定这个Node的在数组中的存放位置。
在HashMap的构造函数中有一个loadFactor.

public HashMap() {
        this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
/**
* The load factor used when none specified in constructor.
*/
static final float DEFAULT_LOAD_FACTOR = 0.75f;

loadFactor = 0.75f的意思是当数组空间占用超过75%的时候会进行重新散列扩充。
HashMap的实现原理效率其实并不高原因如下:
1,有一个初始化容量,在没有存储数据的情况下仍然占用内存
2,达到一定容量就需要进行扩容,扩容过程浪费内存
3,它的遍历是通过遍历Node[]数组来得到对应元素的,数据量很大的时候会比较慢.
所以在Android平台上面出现了SparseArray,ArrayMap用来替代HashMap, 它在小数据容量下面效率比HashMap高,原因是
1, SparseArray中key为int,避免自动装箱为Integer.(ArrayMap的key可以为任何类型)
2, 内部使用数组存储key和value(数组的遍历比链表快)
3, 内部使用二分法存取数据(比HashMap遍历Node[]数组快)
所以
如果数据量超过千级用HashMap,如果千级以内用key为int类型用SparseArray,为long可以用LongSparseArray,其它内类型则用ArrayMap.

【附录】

《HashMap,SparseArray,ArrayMap三者之间》 资料图

需要资料的朋友可以加入Android架构交流QQ群聊:513088520

点击链接加入群聊【Android移动架构总群】:加入群聊

获取免费学习视频,学习大纲另外还有像高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)等Android高阶开发资料免费分享。

    原文作者:Android架构
    原文地址: https://www.jianshu.com/p/9cf6ef152bc8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞