ArrayMap分析

  • 官方解释

//ArrayMap是比HashMap内存效率更高
ArrayMap is a generic key->value mapping data structure that is designed to be more memory efficient than a traditional {@link java.util.HashMap}.
// ArrayMap维持了一个数组才承载map, 一个int[]承载hash值,一个Object[]才承载key/value
// 这样避免了为每个Entry创建一个额外的对象,也尝试更加积极的控制size的增长(增长到极限之后,只需要将这名Entry复制到一个新数组里,不用重新创建hashMap)
It keeps its mappings in an array data structure -- an integer array of hash codes for each item, and an Object array of the key/value pairs. This allows it to avoid having to create an extra object for every entry put in to the map, and it also tries to control the growth of the size of these arrays more aggressively (since growing them only requires copying the entries in the array, not rebuilding a hash map).

还是按照我习惯的定义的方法分析

Map<String, Object> arrayMap = new ArrayMap();

走无参的构造函数,默认capacity=0,创建一个长度为0的hash值数组和一个Object的数组。

put方法实现

不管key是否为null,先获取当前key的hash值,所在的index。
获取index的方法,虽然是不同的方法,但本质上是相同,
查询方法对应的key:一个是对应的值,一个是null,对应的hash值:一个是key对应的hash值,一个是0

在int[] hash数组中查找的过程采用二分查找法,返回对应位置的position,如果没有找到返回低位position的~,会得到一个负数

  • 得到key对应的hash在int[] hash的位置
  1. 得到的是index<0 直接返回该值
  2. 得到的index经转化之后,在Object[]数组中,得到的key与我们的key一致,则直接返回
  3. 如果不等,即可能发生冲突,相同hash值有不同key,则往index前后推算,直到得到key相等的position,返回
  4. 如果都没有找到则返回一个无效的值~msize
  • 得到了最终的index

如果之前存在相同的key,即index>=0
index >= 0 的话,index = (index<<1) +1 把Object[]对应index位置上原来的值取出,并覆盖,返回原来的旧值。

如果不存在,即index=-1
index = ~index 由无效的值,变为之前的值(标黄的值)

此时要做插入操作

  • 如果size>int[] hash的长度
// 如果size超过BASE_SIZE*2设为原来size的1.5倍 
// 重新设置size
final int n = osize >= (BASE_SIZE*2) ? (osize+(osize>>1))
    : (osize >= BASE_SIZE ? (BASE_SIZE*2) : BASE_SIZE);
final int[] ohashes = mHashes;
final Object[] oarray = mArray;
// 创建数组
allocArrays(n)
// 数组之间copy
if (mHashes.length > 0) {
    if (DEBUG) Log.d(TAG, "put: copy 0-" + osize + " to 0");
    System.arraycopy(ohashes, 0, mHashes, 0, ohashes.length);
    System.arraycopy(oarray, 0, mArray, 0, oarray.length);
}
// 释放之前的数据
freeArrays(ohashes, oarray, osize);
  • 如果index<size
    需要两个数组在指定index位置上的后移,为即将加入的数据准备位置

  • 加入到指定位置,
    hash值,直接入int[] hash数组
    key/value ,key入index<<1位置上,value入(index<<1)+1的位置

  • 总长度+1

至此,put的过程结束。

由此可以看出ArrayMap是有序的,按hash值排序

get方法实现

public V get(Object key) {
    // 获取当前key的Index,取出值即可
    final int index = indexOfKey(key);
    return index >= 0 ? (V)mArray[(index<<1)+1] : null;
}

remove方法实现

大体步骤:找到对应key的位置,移除该位置的值,将之前位置重新调整

ArrayMap与HashMap对比

  • 在扩容方面:HashMap采用new的方式,系统开销比较大,ArrayMap则采用System.copyArray()方法
  • 存储结构:HashMap采用Node链表形式,ArrayMap采用了2个数组的形式
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容