【Java面试题】HashMap中插入null key的过程
来源:互联网 发布:路由器转发原理 端口 编辑:程序博客网 时间:2024/06/04 20:01
本文转载自:http://blog.csdn.net/glory1234work2115/article/details/50825503
在HashMap中添加key==null的Entry时会调用putForNullKey方法
下面是HashMap的put方法:
当key==null时就会调用putForNullKey方法下面是putForNullKey的源码:
补充一下table:
transient Node<K,V>[] table;
如果找到了e.key==null,就保存null值对应的原值oldValue,然后覆盖原值,并返回oldValue
如果在table[0]Entry链表中没有找到就调用addEntry方法添加一个key为null的Entry
下面是addEntry的源码:
这个方法首先判断是否要扩容,当现在hashmap中的Entry数大于等于扩容临界值(capacity*load factor)并且index对应的地方没有Entry就扩容hashmap每次扩容的大小为2倍原容量,默认容量为16,hashmap的capacity会一直是2的整数幂。
下面是resize扩容源码:
关键是空表扩容后的拷贝到新表的方法transfer方法,下面是源码:
遍历原表table ,从table[0]开始,e=table[0],不为null就创建一个临时Entry next引用e.的下一个Entry,然后把e放到新表中,头插到table[i]中,i由indexFor方法决定i(h&newCapacity),然后让e=next,继续遍历拷贝。
扩容之后继续插入要插入的Entry,这个时候就要重新hash了,因为旧表已经扩容了,若果key为nul任然是0。
然后进行真正的插入,调用 createEntry(hash, key, value, bucketIndex),下面是源码:
进行头插,创建一个新的entry,new Entry<>(hash,key,value,e)新的entry复制到table[bucketIndex],并next引用原来的table[bucketIndex],完成。
在这里key是null,所以bucketIndex=0,现在的table[0]就是null key Entry。
如果不需要进行扩容,直接在table[0]进行头插就可以了。
总结:
上面分析了null key的插入过程,其实也包括了所有键值插入的过程。
1.先在table[0]的链表中寻找null key,如果有null key就直接覆盖原来的value,返回原来的value;
2.如果在table[0]中没有找到,就进行头插,但是要先判断是否要扩容,需要就扩容,然后进行头插,此时table[0]就是新插入的null key Entry了。
阅读全文
0 0
- 【Java面试题】HashMap中插入null key的过程
- HashMap 中插入null key 的过程
- HashMap中插入null key的过程分析
- HashMap中插入null key的过程分析
- JAVA面试题04-HashMap的实现
- Java关于HashMap的面试题
- HashMap的面试题
- java面试过程中经常遇到的面试题
- java面试题-HashMap原理
- Java集合HashMap---面试题
- Java面试题--HashMap是什么?
- java HashMap插入重复Key值问题
- java HashMap插入重复Key值问题
- java HashMap插入重复Key值问题
- java HashMap插入重复Key值问题
- java面试题之 ((NULL)null).haha();
- java中map插入相同的key
- 45. 腾讯面试题: 使用hashmap 插入数据,怎么样按照插入数据的顺序输出数据
- 36.读书笔记收获不止Oracle之表哈希、合并排序连接与索引
- Cas单点登录(1)原理
- 在uboot下修改环境变量需要注意什么?
- 37.读书笔记收获不止Oracle之常用诊断命令汇总
- Postman使用官方文档翻译--5注册账号
- 【Java面试题】HashMap中插入null key的过程
- 磁盘配额,更改分区方式
- js有关浏览器阻止新开窗口的处理
- python——pandas应用
- Spring Boot通过Mybatis,使用mapper接口和xml配置sql,连接数据库
- Android 6.0 运行权限等级备忘
- beego利用casbin进行权限管理——第一节 起步、测试
- ai技术体系
- Java