ArrayMap源码阅读

Android源码中的一个Map(实现的Map接口),号称能够比hashmap更省内存。因为hashmap是链式地址解决冲突,但是有一个叫entry的类,占了一定空间。key value也是用对象来表示的。

有一个很重要的是,arraymap根本不是哈希表,hash值只是个标记,这根本就是一个二叉查找树。有两个数组:key值数组,与对象数组的下标对应,key值可重复,且有序排列;对象数组,存储真正的键值对,偶数下标是key,奇数是value。

0.为了快速扩展数组空间,使用了static的array cache。结构是[[[...], int[]], int[]]。cache[0]指向下一个数组,cache[1]是被缓存的数组。

1.搜索使用ContainerHelpers中的二分搜索,并对有相同hash值的前后对象进行比较。

2.clear归还了内存,erase只是清空内容。


大Google的猿确实思考的要多一些,很注意细节,把一干class和对象省掉了,代价就是代码可读性大降。其实,很多时候,对象的数组可以用多个filed的数组来实现,这是这个实现方法的基本原理吧。


官方视频

摘要:

0. 100量级的数据,ArrayMap性能不会差太多

1. 数据很少时,ArrayMap仅占用O(数据量)的数据量,HashMap的entry array大小不会改变,占用空间

2. ArrayMap可以使用index遍历,会快一些

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值