关于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的性能测试:
https://www.cnblogs.com/RGogoing/p/5095168.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 传送门:Java(Android)数据结构汇总 -- 总纲 简介 这篇主要来整理下基于Map接口实现的数据结构类。...
    sens_bingo阅读 6,167评论 0 54
  • 一、HashMap概述 HashMap基于哈希表的Map接口的实现。此实现提供所有可选的映射操作,并允许使用nul...
    小陈阿飞阅读 3,783评论 0 2
  • 早几年,链圈的人都在抢着开发项目,希望在BAT还没有理解加密货币之前崛起,完成逆袭。可能吗?但同时,有更多媒体和自...
    大拿BTC阅读 891评论 0 3
  • 2016-05-09 华杉 夏商周三代的田税制度,贡彻助。 【“夏后氏五十而贡,殷人七十而助,周人百亩而彻,其实皆...
    郁萍阅读 4,949评论 0 0
  • 张惠妹-你是爱我的 同样的一场日落 同样你还是没说 只是抱紧我 时间一到就松手 你用一万个理由 都比沉默还温柔 为...
    老鼠恐龙阅读 5,092评论 25 16