1.7-hashtable = 数组 + 链表

(>=) 1.8 = 数组 + 链表 + 红黑树

HashMap 的容量 -》 数组的大小

new HashMap(): 如果不写构造参数,默认大小是16,

如果说写了初始容量:11,hashmap的初始容量就是11?

Hash冲突解决方式:

1.7 头插法

HashMap并不是用取模计算index,而是用位运算!

效率:位运算 > %

并没有说HashMap的容量一定是16,

/** The default initial capacity – MUST be a power of two. */ 必须是2的指数幂?

roundUpToPowerOf2(size);   // 强行将非2的指数次幂的数值转化成2的指数次幂

怎么转化?

1. 必须最接近size,11

2. 必须大于等于size 

3. 必须是2的指数次幂

为什么一定要转成2的指数次幂?

计算索引:int i = indexOf(hash, table.length);

static int indexFor(int h, int length) {

  return h & (table.lenght – 1);

}

HashMap扩容

当前HashMap存了多少Element,size >= threshold,threshold为扩容阈值

threshold扩容阈值 = capacity * 加载因子。

扩容怎么扩?

扩容为原来的2倍,

转移数据,

 

重要成员变量

DEFAULT_INITIAL_CAPACITY = 1<<4; Hash表默认初始容量

MAXIMUM_CAPACITY= 1<<30; 最大Hash表容量

DEFAULT_LOAD_FACTOR=0.75f; 默认加载因子

TREEIFY_THRESHOLD=8; 链表转红黑树阈值

UNTREEIFY_THRESHOLD=6; 红黑树转链表阈值

MIN_TREEIFY_CAPACITY=64; 链表转红黑树时hash表最小容量阈值,达不到优先扩容。

End!

原文地址:http://www.cnblogs.com/zhf123/p/16868071.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性