zoukankan      html  css  js  c++  java
  • [转]合理使用ArrayMap代替HashMap

    合理使用ArrayMap代替HashMap

    转载请标注: 
    披萨大叔的博客 http://blog.csdn.net/qq_27258799/article/details/51861350

    我们都知道当key是int的时候,用SparseArray代替HashMap是个更省内存的方案。如果key是String或者其他自定义类型呢,不要忘了还有ArrayMap。

    ArrayMap是一个< key,value >映射的数据结构,它设计上更多的是考虑内存的优化,内部是使用两个数组进行数据存储,一个数组记录key的hash值,另外一个数组记录Value值,它和SparseArray一样,也会对key使用二分法进行从小到大排序,在添加、删除、查找数据的时候都是先使用二分查找法得到相应的index,然后通过index来进行添加、查找、删除等操作,所以,应用场景和SparseArray的一样,如果在数据量比较大的情况下,那么它的性能将退化至少50%。

    所以ArrayMap是牺牲了时间换区空间。在写手机app时,适时的使用ArrayMap,会给内存使用带来可观的提升。

    ArrayMap和HashMap主要不同之处在于:

    1、存储方式不同:ArrayMap内部使用两个数组,一个存HashCode,一个存键值对对象。HashMap内部是Entry对象,没看过HashMap源码的,可以先看看 HashMap源码分析

    2、扩容方式不同:上面HashMap源码分析这篇文章说过了,HashMap初始大小是16,达到满容量的0.75时,要扩容,每次都是上次容量的2倍。而ArrayMap是这样

          //如果容量不够
            if (mSize >= mHashes.length) {
                final int n = mSize >= (BASE_SIZE*2) ? (mSize+(mSize>>1))
                        : (mSize >= BASE_SIZE ? (BASE_SIZE*2) : BASE_SIZE);
    
                if (DEBUG) Log.d(TAG, "put: grow from " + mHashes.length + " to " + n);
    
                final int[] ohashes = mHashes;
                final Object[] oarray = mArray;
            //分配数组
                allocArrays(n);
    
                if (mHashes.length > 0) {
                    if (DEBUG) Log.d(TAG, "put: copy 0-" + mSize + " to 0");
                    //特别注意这,是copy,而不是new,效率提升
                    System.arraycopy(ohashes, 0, mHashes, 0, ohashes.length);
                    System.arraycopy(oarray, 0, mArray, 0, oarray.length);
                }
                    //释放无用空间,收缩数组
                freeArrays(ohashes, oarray, mSize);
            } 

    ArrayMap用的是copy数据,所以效率相对要高。

    最后说说使用场景,如果存储数量在千级以下,可以考虑用ArrayMap代替HashMap,但要注意的是,ArrayMap要比HashMap慢。Android里的Bundle内部就是ArrayMap,所以大家可以自行考虑使用。

  • 相关阅读:
    复旦大学软件学院预推免经验贴
    寒武纪-算法研究实习生

    C++ 笔记
    Deep Layer Aggregation论文笔记
    项目:语义分割DeepLabv3-树莓派4B部署
    神经网络加速引擎对比调研
    东南大学网安学院预推免经验帖
    中科院深圳先进院夏令营经验贴
    华东师范大学软院夏令营经验贴
  • 原文地址:https://www.cnblogs.com/didiaoxiong/p/9120669.html
Copyright © 2011-2022 走看看