ArrayMap详解

首先说下为什么要用ArrayMap.java中的hashmap在初始化对象的时候便会分配16个大小的数组作为默认数组,无论你何时使用,若一个app中有特别多的hashmap用来存储少量数据的时候,就会造成特别多的内存浪费。因此出于此原因,google推出了ArrayMap这一数据结构作为移动端的用来存储键值对的轻量级的数据机构。首先我们在new对象的时候,并不会立即去申请存储空间除非你自己制定初始化空间。这样就能够在我们初始化了map之后并未使用时为系统节省空间。ArrayMap的第一次初始化是在我们往map中存放东西的时候,向系统申请一个BASE_SIZE个大小的数组也就是4个大小的数组。在这个类中存在一个10个数组的缓存池,当缓存池中有缓存时。在申请的时候会根据申请的大小,由这个缓存池中提取数组。ArrayMap中他有两个数组用来存储信息。一个用来存储key的hash值,另外一个用来存储键和值。存储键和值的数组大小始终为存储Key的hash值的两倍。put的时候先会采用二分法查找这个值的hash值的位置,如果找到的话就返回此hash值在数组中的下标,如果没找到就会返回此hash值应该存在的下标。然后根据返回值将键值对存入。伴随着存入元素的越来越多,当超过4个元素的时候,便会进行扩容操作。扩容的时候若扩容前的数组是4或者8个元素的时候,则在扩容的时候会将原数组进行回收,放进缓冲池中,具体的操作是将之前的缓存池放入到待回收数组的0号位置,将hash数组放到数组的一号位置,并将1号位置后的元素全部置空方便虚拟机GC,然后将这个数组置成缓存数组,完成回收对象的操作。这样便能够很好的利用对象的生命周期,避免不必要的GC,以及性能开销。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值