前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >那么HashMap什么时候进行扩容呢?

那么HashMap什么时候进行扩容呢?

原创
作者头像
用户7365393
修改2021-10-08 15:21:53
6910
修改2021-10-08 15:21:53
举报

 那么HashMap什么时候进行扩容呢?

当HashMap中的元素个数超过数组大小*loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中元素个数超过16*0.75=12(这个值就是代码中的threshold值,也叫做临界值)的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么预设元素的个数能够有效的提高HashMap的性能。

HashMap扩容的代码如下所示:

代码语言:javascript
复制
          //HashMap数组扩容
          void resize(int newCapacity) {
                Entry[] oldTable = table;
                int oldCapacity = oldTable.length;
                //如果当前的数组长度已经达到最大值,则不再进行调整
                if (oldCapacity == MAXIMUM_CAPACITY) {
                    threshold = Integer.MAX_VALUE;
                    return;
                }
                //根据传入参数的长度定义新的数组
                Entry[] newTable = new Entry[newCapacity];
                //按照新的规则,将旧数组中的元素转移到新数组中
                transfer(newTable);
                table = newTable;
                //更新临界值
                threshold = (int)(newCapacity * loadFactor);
            }

          //旧数组中元素往新数组中迁移
            void transfer(Entry[] newTable) {
                //旧数组
                Entry[] src = table;
                //新数组长度
                int newCapacity = newTable.length;
                //遍历旧数组
                for (int j = 0; j < src.length; j++) {
                    Entry<K,V> e = src[j];
                    if (e != null) {
                        src[j] = null;
                        do {
                            Entry<K,V> next = e.next;
                            int i = indexFor(e.hash, newCapacity);
                            e.next = newTable[i];
                            newTable[i] = e;
                            e = next;
                        } while (e != null);
                    }
                }
            }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档