博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HashMap的put源码解析
阅读量:4293 次
发布时间:2019-05-27

本文共 2509 字,大约阅读时间需要 8 分钟。

put方法的源码如下:

public V put(K key, V value) {        //在JDK1.8中,实际上调用的putVal方法        return putVal(hash(key), key, value, false, true);    }
  • 1
  • 2
  • 3
  • 4

putVal方法:

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {        Node
[] tab; Node
p; int n, i; //1.判断tab是否为空,是否还有剩余空间,是否需要扩容操作 if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; //给p赋值,为一个节点的位置,若为空,创建一个新节点,调用的LinkedHashMap的newNode方法 if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null); else { Node
e; K k; //1.比较哈希值是否相同;2.比较key实例是否相同;3.比较key的值 if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k)))) //若值已经存在,直接覆盖 e = p; //若p是一个TreeNode对象 else if (p instanceof TreeNode) //在红黑树中直接插入键值对 e = ((TreeNode
)p).putTreeVal(this, tab, hash, key, value); else { //开始遍历链表,准备插入 for (int binCount = 0; ; ++binCount) { if ((e = p.next) == null) { //创建要进行插入的节点 p.next = newNode(hash, key, value, null); //如果链表的长度大于8了,进行链表->红黑树的转换操作 if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st treeifyBin(tab, hash); break; } //如果存在KEY值,直接赋值覆盖value if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; } } //上面过程为给e这个Node
对象赋值 if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue; } } ++modCount; //判断是否超过最大容量,需要扩容 if (++size > threshold) resize(); afterNodeInsertion(evict); return null; }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
版权声明:本文为博主原创文章,想转就转吧我拦不住。 https://blog.csdn.net/No_Endless/article/details/60467251
你可能感兴趣的文章
阻塞队列
查看>>
linux的基础知识
查看>>
接口技术原理
查看>>
五大串口的基本原理
查看>>
PCB设计技巧与注意事项
查看>>
linux进程之间通讯常用信号
查看>>
main函数带参数
查看>>
PCB布线技巧
查看>>
关于PCB设计中过孔能否打在焊盘上的两种观点
查看>>
PCB反推理念
查看>>
京东技术架构(一)构建亿级前端读服务
查看>>
git 提示:error: unable to rewind rpc post data - try increasing http.postBuffer
查看>>
php 解决json_encode中文UNICODE转码问题
查看>>
LNMP 安装 thinkcmf提示404not found
查看>>
PHP empty、isset、innull的区别
查看>>
apache+nginx 实现动静分离
查看>>
通过Navicat远程连接MySQL配置
查看>>
phpstorm开发工具的设置用法
查看>>
Linux 系统挂载数据盘
查看>>
Git基础(三)--常见错误及解决方案
查看>>