美文网首页
ArrayList 和LinkedList, HashMap 、

ArrayList 和LinkedList, HashMap 、

作者: 我默默 | 来源:发表于2020-10-11 11:47 被阅读0次

    ArrayList ---->数组集合 逻辑上和物理内存都是连续的不间断,方便查询,不方便插入删除(内部使用Systom.copy操作)类比:乾坤圈
    LinkedList---->链表集合 逻辑上连续但物理存储不连续,每个节点都有next,方便插入,不方便查询(类比:项链)
    HashMap --->结合了ArrayList 和LinkedList的优点, 内部使用hashcode作为table表的索引,每个索引对应的一组链表
    带来问题:hash碰撞:
    解决方案 :
    a,达到hash 阈值(size * 0.75)就需要 扩容 x 2,浪费了内存 (假如16个坑位,hash值分布为2,11,就造成了内存大量浪费),一旦扩容,全部的数据需要重新hash,非常浪费时间,所以预判size是一个高工的标配
    b,内存不可能一直扩容下去,就需要secondhash(),算法是google工程师为了让hash分布更为均匀的一个算法
    辅助解决方法:
    1开放地址法(即长度为2的整数倍,求模时候11111把地址全部用上,若不是2整数倍,会造成地址浪费)
    2链地址法(即通过hash之后的index,相同的存进一个链表linkedlist,防止存不进去-----但是要避免一个链存太多,效率下降,也是分布布局的一种体现)
    3建立公共溢出区(0.75可用,剩下的舍弃,google经验值)

    稀疏数组 SparseArray:两个长度相同的数组:mKeys,mValues,

    1. key只支持数字(可以避免hashMap自动拆箱装箱的过程,加快速度)
    2. 结构相对简单,只有两个数组,不需要其他结构(结构比较简单,不引入其他复杂结构)

    频繁的插入删除SparseArray的速度会越来越快,原因是:
    SparseArray虽然是离散数组,但是key的分布是:123...5...89一个自增的顺序,真正的提速关键在于:
    当remove一个,并不是直接删除,而是将对应的mValues[index]--->赋值为一个new Object()空对象,这样就避免了System.arraycopy()操作,不用copy移动 index---length的元素,节约时间
    当add一个,先二分法定位index,然后如果发现数组中存在一个new Obejct()的对象,就直接赋值这个对象,不存在再进行System.arrayCopy(),这样的有效的减少了copy时间,就加快了速率。

    现实开发中,能用SparseArray就不用Hashmap,但是局限于SparseArray只能是int作为key,可以考虑将一些常量值写在xml中,使用R.String.xxx的方式引入,这样做只是增加了xml的大小,编译会慢一丢丢,但是可以大幅提升Runtime的执行效率。

    相关文章

      网友评论

          本文标题:ArrayList 和LinkedList, HashMap 、

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