Java知识分享网 - 轻松学习从此开始!    

Java知识分享网

Java1234官方群25:java1234官方群17
Java1234官方群25:838462530
        
SpringBoot+SpringSecurity+Vue+ElementPlus权限系统实战课程 震撼发布        

最新Java全栈就业实战课程(免费)

springcloud分布式电商秒杀实战课程

IDEA永久激活

66套java实战课程无套路领取

锋哥开始收Java学员啦!

Python学习路线图

锋哥开始收Java学员啦!
当前位置: 主页 > Java文档 > Java基础相关 >

Java开发手册(泰山版)_灵魂13问 PDF 下载


分享到:
时间:2020-07-31 09:43来源:http://www.java1234.com 作者:小锋  侵权举报
Java开发手册(泰山版)_灵魂13问 PDF 下载
失效链接处理
Java开发手册(泰山版)_灵魂13问 PDF 下载


本站整理下载:
 
相关截图:
 
主要内容:

的:size、loadFactor、threshold、DEFAULT_LOAD_FACTOR 和 DEFAULT_
INITIAL_CAPACITY。
我们先来简单解释一下这些参数的含义,然后再分析他们的作用。
16  > 为什么阿里巴巴建议初始化 HashMap 的容量大小?
HashMap 类中有以下主要成员变量:
● transient int size;
○ 记录了 Map 中 KV 对的个数
● loadFactor
○ 装载印子,用来衡量 HashMap 满的程度。loadFactor 的默认值为 0.75f
(static final float DEFAULT_LOAD_FACTOR = 0.75f;)。
● int threshold;
○ 临界值,当实际 KV 个数超过 threshold 时,HashMap 会将容量扩容,
threshold =容量 * 加载因子
● 除了以上这些重要成员变量外,HashMap 中还有一个和他们紧密相关的概
念:capacity
○ 容量,如果不指定,默认容量是 16(static final int DEFAULT_INI￾TIAL_CAPACITY = 1 << 4;)
可能看完了你还是有点蒙,size 和 capacity 之间有啥关系?为啥要定义这两个
变量。loadFactor 和 threshold 又是干啥的?
size 和 capacity
HashMap 中的 size 和 capacity 之间的区别其实解释起来也挺简单的。我们知
道,HashMap 就像一个“桶”,那么 capacity 就是这个桶“当前”最多可以装多少
元素,而 size 表示这个桶已经装了多少元素。来看下以下代码:
 Map<String, String> map = new HashMap<String, String>();
 map.put("hollis", "hollischuang");
 Class<?> mapType = map.getClass();
 Method capacity = mapType.getDeclaredMethod("capacity");
 capacity.setAccessible(true);
 System.out.println("capacity : " + capacity.invoke(map));
 Field size = mapType.getDeclaredField("size");
 size.setAccessible(true);
为什么阿里巴巴建议初始化 HashMap 的容量大小? <  17
 System.out.println("size : " + size.get(map));
我们定义了一个新的 HashMap,并想其中 put 了一个元素,然后通过反射的方
式打印 capacity 和 size。输出结果为:capacity : 16、size : 1
默认情况下,一个 HashMap 的容量(capacity)是 16,设计成 16 的好处我在
《全网把 Map 中的 hash() 分析的最透彻的文章,别无二家》中也简单介绍过,主要
是可以使用按位与替代取模来提升 hash 的效率。
为什么我刚刚说 capacity 就是这个桶“当前”最多可以装多少元素呢?当前怎
么理解呢。其实,HashMap 是具有扩容机制的。在一个 HashMap 第一次初始化的
时候,默认情况下他的容量是 16,当达到扩容条件的时候,就需要进行扩容了,会
从 16 扩容成 32。
我们知道,HashMap 的重载的构造函数中,有一个是支持传入 initialCapacity
的,那么我们尝试着设置一下,看结果如何。

 

------分隔线----------------------------

锋哥公众号


锋哥微信


关注公众号
【Java资料站】
回复 666
获取 
66套java
从菜鸡到大神
项目实战课程

锋哥推荐