Hash 对象的扩容流程是怎么样的?
回答·3
最热
最新
- 2 种情况吧,1 种是当数组的容量达到负载因子*数组的长度就会创建 2 倍长度的新数组 然后对原来老数组里面的元素进行 rehash。之后将之前数组的元素放到新的数组里面
- 以下是个人理解: 以 HashMap 为例,它的数据结构是数组+链表+红黑树,扩容指的是数组的扩容,初始长度是 16,上限是 2 的 32 次方。扩容的负载因子是 0.75,比如说我长度是 16,当我的数组达到负载因子即 16*0.75=12 的时候,数组就会进行扩容,扩容的容量是 2 的 n 次方,当你扩容之后你原有的数据的健会重新进行 hash 运算,key 二次 hash 然后对数组长度进行取模,对应到数组的下标,这时候会涉及到一个树退化的机制(链表长度小于 6 的时候) ps:当你数组长度>=64 且链表长度=6 的时候就会转为红黑树。 值得一提的是为什么负载因子是 0.75 而不是其他呢? 一方面是阈值=负载因子*容量,根据 hashmap 的扩容机制,它会保证容量永远都是 2 的幂,为了使阈值永远都是正数,那么负载因子取 0.75 比较合理,因为这个数和任何 2 次幂的乘积都是正数 另一方面,负载因子越大,产生的 hash 冲突的概率也就越大;负载因子越小,浪费的空间也就越小,这是一个不可避免的利弊关系,为了平衡这个条件,取值 0.75 比较合理。
- 不知道。 估计是容量达到上限之后,就会扩充容量,再把原有的元素重新进行 hash 运算