专栏首页人生得意须尽欢那么HashMap什么时候进行扩容呢?
原创

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

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

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

HashMap扩容的代码如下所示:

          //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);
                    }
                }
            }

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

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

关注作者,阅读全部精彩内容

我来说两句

0 条评论
登录 后参与评论

相关文章

  • VR内容什么时候可以爆发呢? | 拔刺

    先来看看什么是VR虚拟现实技术。VR是基于计算机技术结合传感器构建体验虚拟现实的技术,能够给用户带来身临其境的沉浸感。VR系统的基本要素是计算机技术和传感器技术...

    镁客网
  • 读书笔记 dotnet 什么时候进行垃圾回收

    是否有小伙伴好奇如果没有在代码调用垃圾回收,那么框架会在什么时候调用垃圾回收。本文是读还没出版的伟民哥翻译的 .NET内存管理宝典 - 提高代码质量、性能和可扩...

    林德熙
  • 原创 | 万万没想到,HashMap默认容量的选择,竟然背后有这么多思考!?

    集合是Java开发日常开发中经常会使用到的,而作为一种典型的K-V结构的数据结构,HashMap对于Java开发者一定不陌生。

    敖丙
  • 集合~HashMap

    大概如下,数组里面每个地方都存了Key-Value这样的实例,在Java7叫Entry在Java8中叫Node。

    Vincent-yuan
  • Java源码解读 --- HashMap&ConcurrentHashMap

    HashMap是一个常用的集合,日常使用可能我们并不关心它是如何实现的,不过它是面试中的常客。所以为了弄懂它,不妨看一看源码,同时也可以学习一下大牛的编程思想。

    贪挽懒月
  • 【Java高薪面试宝典】Day3、图解HashMap高频面试及底层实现架构!

    Map接口大家应该都听说过吧?它是在Java中对键值对进行存储的一种常用方式,同样其中的HashMap我相信大家应该也不会陌生,一说到HashMap,我想稍微知...

    灰小猿
  • 深入理解JDK7 HashMap

    在正式讨论HashMap之前,我们有必要把Map家族的继承实现关系展示出来,方便理解后续的内容。

    itlemon
  • 高效编程之hashmap你不看就会忘记的知识点

    以前菜得不能看的时候看Java的招聘要求:Java基础扎实,熟悉常用集合类,多线程,IO,网络编程,经常会疑惑,集合类不就ArrayList,HashMap会用...

    用户2141593
  • 高效编程之hashmap你必须要懂的知识点

    以前看Java的招聘要求:Java基础扎实,熟悉常用集合类,多线程,IO,网络编程,经常会疑惑,集合类不就ArrayList,HashMap会用,熟悉下API不...

    矿泉水
  • HashMap的默认容量为什么要设置16?

    在HashMap中,indexFor方法其实主要是将hashcode换成链表数组中的下标。

    Vincent-yuan
  • 终于搞懂HashMap的源码了!!!

    HashMap是我们在平时开发最常用的容器之一,但是我们有真正了解过他吗?他是线程安全的吗?他是以何种方式来存储的呢?为什么初始化的容器大小时2的n次幂呢?他是...

    居士
  • 7000 字说清楚 HashMap,面试点都在里面了

    在 Java 中,最常用的数据类型是 8 中基本类型以及他们的包装类型以及字符串类型,其次应该就是 ArrayList和HashMap了吧。HashMap存的是...

    古时的风筝
  • Java HashMap 的那么多为什么

    其中方法 hashcode() 返回的是 Java 对象的 hash_code,这是一个 int 类型的值(32 位)。那么为什么在拿到这个值之后,还需要将自...

    syy
  • HashMap知识总结

    HashMap 是我们非常常用的数据结构,由数组和链表组合构成的数据结构。数组里每个地方都存了Key-Value这样的实例,在Java7叫Entry,在Java...

    故里
  • 让我再撸一次HashMap

    由于近期忙着搬家,又偷懒了几个礼拜! 其实我很早以前就想写一篇关于HashMap的面试专题。对于JAVA求职者来说,HashMap可谓是集合类的重中之重,甚至你...

    Java识堂
  • ArrayMap和HashMap区别

    Hash,也可以称为“散列”,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这是一种压缩映射,也就是,散列值的空间通常远小于输入的...

    Dawnzhang
  • 教你如何阅读HashMap源码~吊打面试官

    先说这么多吧,相信大家应该都会被问过这些问题,会不会很惊讶,就一个hashmap都能整出这么多面试问题?接下来我会通过本篇文章带着大家一起解读hashmap的这...

    AI码师
  • 【简单了解系列】从基础的使用来深挖HashMap

    说的专业一点,HashMap是常用的用于存储key-value键值对数据的一个集合,底层是基于对Map的接口实现。每一个键值对又叫Entry,这些Entry分散...

    SH的全栈笔记
  • 《吊打面试官》系列-HashMap

    作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚(请允许我使用一下夸张的修辞手法)。

    敖丙

扫码关注云+社区

领取腾讯云代金券