至于为什么是2的30次方,不是别的数字或者最大整数,这主要是从性能和分布均匀两方面来考虑的:
加快hash计算速度;
均匀分布,减少hash冲突;
2的n次方,可以通过位移操作来实现,可以加快hash计算速度,结合按位与计算加快数组下标的计算。例如在HashMap做扩容时,满足2的幂就是相当于每次扩容都是翻倍(就是<<1右移一位),这样扩容时在重新计算下标位置时,只有两种情况,一种是下标不变,另一种是下标变为:原下标位置+扩容前容量,这样扩容后节点移动相对较少,也可以提高性能。。
可以改善数据的均匀分布,减少hash冲突,毕竟hash冲突越大,代表数组中一个链的长度越大,这样的话会降低hashmap的性能。
其中关键代码为HashMap中的数组下标计算:i = (n - 1) & hash,该计算方法可以实为什么要满足2的n次方
至于为什么是2的30次方,不是别的数字或者最大整数,这主要是从性能和分布均匀两方面来考虑的:
加快hash计算速度;
均匀分布,减少hash冲突;
2的n次方,可以通过位移操作来实现,可以加快hash计算速度,结合按位与计算加快数组下标的计算。例如在HashMap做扩容时,满足2的幂就是相当于每次扩容都是翻倍(就是<<1右移一位),这样扩容时在重新计算下标位置时,只有两种情况,一种是下标不变,另一种是下标变为:原下标位置+扩容前容量,这样扩容后节点移动相对较少,也可以提高性能。。
可以改善数据的均匀分布,减少hash冲突,毕竟hash冲突越大,代表数组中一个链的长度越大,这样的话会降低hashmap的性能。
其中关键代码为HashMap中的数组下标计算:i = (n - 1) & hash,该计算方法可以实现一个均匀分布。现一个均匀分布。
网友评论