美文网首页Android开发程序员Android进阶之路
HashMap,SparseArray,ArrayMap三者之间

HashMap,SparseArray,ArrayMap三者之间

作者: Android架构 | 来源:发表于2019-02-28 20:50 被阅读5次

    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.

    【附录】

    资料图

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

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

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

    相关文章

      网友评论

        本文标题:HashMap,SparseArray,ArrayMap三者之间

        本文链接:https://www.haomeiwen.com/subject/qqxluqtx.html