概述 集合初始化通常进行分配容量、设定特定参数等相关工作。...我们以使用频率相对较高的ArrayList和HashMap为例,简要说明初始化的相关工作,并解释为什么在任何情况下,都需要显示地为集合容器设定初始化大小。...HashMap是存储K-V键值对的哈希式结构集合。 ? 分析两者的初始化相关源码,洞悉它们的容量分配、参数设定等相关逻辑,有助于更好的理解集合特性,从而提升代码质量。...public HashMap(int initialCapacity, float loadFactor) { //初始容量值小于0,抛出参数非法异常 if (initialCapacity...,Object> hashMap=new HashMap(1024); 总结 综上所述,集合初始化时,指定集合初始容量大小。
有一个初始容量参数的构造方法HashMap(int initialCapacity) 有两个参数的构造方法HashMap(int initialCapacity, float loadFactor) 扰动函数...答案:会获得最接近的一个2的次幂作为容量 有一个初始容量参数的构造方法HashMap(int initialCapacity) 参数:initialCapacity 初始容量 public HashMap..., DEFAULT_LOAD_FACTOR); } 这个一个参数的构造方法,使用HashMap的默认负载因子,把该初始容量和默认负载因子作为入参,调用HashMap的两个参数的构造方法 有两个参数的构造方法...HashMap(int initialCapacity, float loadFactor) 参数:initialCapacity 初始容量 参数:loadFactor 负载因子 /** *...* 通过指定的初始容量和负载因子初始化一个空的HashMap * * @param initialCapacity the initial capacity 初始化容量
HashMap ---- HashMap在初始化的时候,会制定初始容量(16)和加载因子(扩容临界值0.75,意思就是当容量达到10*0.75=12的时候就会扩容): //默认初始化化容量,即16...initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY) //参数有效性检查 initialCapacity...,容量去默认值,即16 public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR..., DEFAULT_LOAD_FACTOR); } //通过其他Map来初始化HashMap,容量通过其他Map的size来计算,装载因子取0.75 public HashMap(MapLOAD_FACTOR); inflateTable(threshold);//初始化HashMap底层的数组结构
HashMap的实例有两个参数影响其性能:初始容量和负载因子。 容量是哈希表中数组元素的数量,初始容量只是哈希表在创建时的容量。负载因子是哈希表在其容量自动增加之前可以达到的最大限度。...c、static final float DEFAULT_LOAD_FACTOR = 0.75f; 默认的负载因子,如果在创建HashMap的构造函数中没有指定负载因子则指定该HashMap.../** * 根据传入的初始化容量计算该HashMap的容量(即元素的数量) **/ if (initialCapacity...MAXIMUM_CAPACITY : n + 1; } (2)public HashMap(int initialCapacity) { //初始化容量传入,...加载因子为默认值0.75f this(initialCapacity, DEFAULT_LOAD_FACTOR); } (3)public HashMap()
的初始化 //HashMap构造方法 public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity <...; init(); } 这是HashMap的构造函数之一,其他构造函数都引用这个构造函数进行初始化。...参数InitialCapacity指的是HashMap中table数组最初的大小,参数loadFactory指的是HashMap可容纳键值对与数组长度的比值(举个例子:数组长度默认值为16,loadFactory...*load factory(负载因子)得来。...InflateTable方法进行初始化,输入参数为初始设置的InitialCapacity,实际上他会调用roundUpToPowerOf2方法返回一个比初始容量大的最小的2的幂数(其中一个原因是在得到
HashMap和concurrentHashMap的初始化时的区别 初始化的区别 主要分析下传入指定容量时,最后真正初始化的容量到底是多少?.... */ public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR...and load factor...* * @param initialCapacity the initial capacity * @param loadFactor the load factor...=大于(1.5倍initialCapacity+1)的最小的2的幂次 这算出来的也就是容量,但是sizeCtl变量还有其他的含义 sizeCtl的含义 用来控制表初始化和扩容的,默认值为0,当在初始化的时候指定了大小
“ 本文将主要介绍New HashMap()做了些什么以及Node数组是怎么进行初始化的。”...*/ public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; } /** * 设置初始容量构造方法 * 这里调用的是另外一个构造方法...* 传入的参数是客户定义的容量 * 和默认的使用率75% */ public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR...04 — 初始化 计算HashMap对象已经有了,那我们肯定是要向里面放数据。我们看下put方法。...初始化总结: 数组创建延迟到了第一次放数据的时候 无参构造方法采用的是默认长度16的数组和使用率0.75 有容量构造方法传入的容量是通过扩容阀值进行中间传递赋值的 HashMap的初始化就学习到这里,想继续跟随我学习了解
几种构造方法 hashmap初始化时为懒加载方式,即在初始化时仅声明容量及扩容阈值等, 不多说上代码。...//构造方法1,指定初始容量及装载因子 public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity...= tableSizeFor(initialCapacity); } //构造方法2,仅指定初始容量,装载因子的值采用默认的 0.75 public HashMap(int initialCapacity...) { this(initialCapacity, DEFAULT_LOAD_FACTOR); } //构造方法3,所有参数均采用默认值 public HashMap() {...this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted } 重要说明 此方法意为传一个期望值返回一个最接近期望值的
构造函数 构造函数只是对 初始化容量 和 加载因子进行赋值, public HashMap(int initialCapacity, float loadFactor) { if...tt>HashMap with the specified initial * capacity and the default load factor (0.75).... */ public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR...* (16) and the default load factor (0.75). */ public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR...resize 初始化 hash 表Node 数组大小为 16,如果 Node数组的元素达到 threadhold 重新调整 hashMap 数组大小,变成原来两倍。
我说小朋友:如果想指定 HashMap 对象的容量得用2的N次方 。假如不是2的N次方那么在第一次put 元素的时候也会自动把容量设置为比传入参数大的最小的2的N次方,并不是你指定的这个值。...什么是HashMap? 在弄懂标题的问题之前,首先需要清楚 HashMap 的概念。HashMap 是基于哈希表的 Map 接口的实现,线程不安全,且不保证映射顺序。...代码如下: public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR); } public... HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException...MAXIMUM_CAPACITY : n + 1; } 在第一次调用 put 方法时,由于未初始化数组则会调用 resize() 方法初始化数组,而 threshold 参数则是初始化数组的长度。
DEFAULT_INITIAL_CAPACITY HashMap默认的初始化容量,默认值16,初始化的容量可以在HashMap被初始化时进行指定,但是必须是2的幂。...MAXIMUM_CAPACITY 默认的最大容量(2的30次方),HashMap的最大容量也可以在初始化时进行指定,但指定的值必须在2的幂并且小于等于2的30次方 DEFAULT_LOAD_FACTOR...构造方法 public HashMap() {} public HashMap(int initialCapacity) {} public HashMap(int initialCapacity...extends V> m) {} HashMap的构造方法主要有上面三种,我们主要看第三种: public HashMap(int initialCapacity, float loadFactor...首先会check参数的正确性(初始化容量、负载因子),check完参数以后会设置负载因子,以及下一次扩容时HashMap中k-v的数量。
(int initialCapacity)** **3、有两个参数的构造方法HashMap(int initialCapacity, float loadFactor)** **4、有一个Map类型的参数的构造方法...HashMap(int initialCapacity) 参数:initialCapacity 初始容量 public HashMap(int initialCapacity) { //...此处通过把第二个参数负载因子使用默认值0.75f,然后调用有两个参数的构造方法 this(initialCapacity, DEFAULT_LOAD_FACTOR); } 这个一个参数的构造方法...,使用HashMap的默认负载因子,把该初始容量和默认负载因子作为入参,调用HashMap的两个参数的构造方法 3、有两个参数的构造方法HashMap(int initialCapacity, float...* 通过指定的初始容量和负载因子初始化一个空的HashMap * * @param initialCapacity the initial capacity 初始化容量
* 有参构造,初始化容量,默认加载因子为(0.75f) * @param initialCapacity the initial capacity....HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR); } /**...16,初始化阈值为12 newCap = DEFAULT_INITIAL_CAPACITY; newThr = (int)(DEFAULT_LOAD_FACTOR...说明:HashMap 使用 HashMap(int initialCapacity) 初始化,如果暂时无法确定集合大小,那么指定默 认值(16)即可。...HashMap如何存放1万条key效率最高 初始化hashMap时指定容量大小为:(10000需要存储的元素个数 / 负载因子) + 1 12.
); } public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR...); } public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; // all other...fields defaulted } 上面是 JDK8 的构造函数 在无参构造函数时,JDK8 是初始化 loadFactor 让其等于默认值,那 JDK7 是什么样子的呢?...HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR); } public...,对,就是无参构造的时候,JDK8在这里和JDK7出现了差异化的地方,JDK7 是调用了一个有参的构造函数,参数使用了默认值, 但是最终的结果实际上是一直的,都是使用的一个默认值,所以阿粉就不再给大家多说这块的内容了
val, next); } } ◆ HashMap的构造方法 ◆ 因子的构造方法 */ public HashMap(int initialCapacity...0.75f */ public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR...extends V> m) { this.loadFactor = DEFAULT_LOAD_FACTOR; // 将m中的全部元素逐个添加到HashMap中...putMapEntries(m, false); } /** * 根据初始容量计算计算当前HashMap的容量 * 检查所传的参数是否为2的幂次方 * 如果不为2的幂次方则将其变为比...是否已初始化,没有初始化则执行初始化逻辑 如果已初始化则进行扩容HashMap 。
= 6: 当树的节点数小于等于该参数转成链表 介绍完了重要的几个参数后我们来看看HashMap的构造参数。...defaulted } public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR...); } public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity <...扩容可以分为三种情况: 第一种:使用默认构造方法初始化HashMap。...同时threshold = DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR = 12。 第二种:指定初始容量的构造方法初始化HashMap。
HashMap(int, float)型构造函数 public HashMap(int initialCapacity, float loadFactor) { // 初始容量不能小于0,否则报错...this.loadFactor = loadFactor; // 初始化threshold大小 this.threshold = tableSizeFor(initialCapacity...public HashMap(int initialCapacity) { // 调用HashMap(int, float)型构造函数 this(initialCapacity, DEFAULT_LOAD_FACTOR...HashMap()型构造函数。 public HashMap() { // 初始化填充因子 this.loadFactor = DEFAULT_LOAD_FACTOR; } 4....extends V> m) { // 初始化填充因子 this.loadFactor = DEFAULT_LOAD_FACTOR; // 将m中的所有元素添加至HashMap中
JDK7中HashMap源码中的构造器 /** 默认的初始化容量、默认的加载因子 * Constructs an empty HashMap with.... */ public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR...(16) and the default load factor (0.75). */ public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR.... */ public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR...(loadFactor > 0) || initialCapacity 参数检查 throw new IllegalArgumentException
参考链接: Java ConcurrentHashMap 相对于HashMap,ConcurrentHashMap提供了内部实现的并发支持。...我们最好是从构造函数参数开始。...ConcurrentHashMap完整的构造函数需要三个参数:initialCapacity(初始容量),loadFactory(加载因子),concurrencyLevel(并发级别)。 ...基于以上讨论,一个建议是更明智地使用构造函数参数,以减少冗余对象,同时提高性能。 ...ConcurrentHashMap更好的初始化方式: ConcurrentHashMap instance = new ConcurrentHashMap<String
领取专属 10元无门槛券
手把手带您无忧上云