文档章节

java8中的HashMap的putVal方法

清尘V
 清尘V
发布于 2016/03/28 11:49
字数 519
阅读 119
收藏 0
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
               boolean evict) {
    Node<K,V>[] tab; Node<K,V> p; int n, i;
    if ((tab = table) == null || (n = tab.length) == 0)
        n = (tab = resize()).length;
    if ((p = tab[i = (n - 1) & hash]) == null)
        tab[i] = newNode(hash, key, value, null);
    else {
        Node<K,V> e; K k;
        if (p.hash == hash &&
            ((k = p.key) == key || (key != null && key.equals(k))))
            e = p;
        else if (p instanceof TreeNode)
            e = ((TreeNode<K,V>)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);
                    if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                        treeifyBin(tab, hash);
                    break;
                }
                if (e.hash == hash &&
                    ((k = e.key) == key || (key != null && key.equals(k))))
                    break;
                p = e;
            }
        }
        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. 【4】【5】如果原始的节点数组为空或者节点数目=0,则重置数组大小为默认值(resize方法)

  2. 【6】(n-1)&hash查找hash表中的数组索引,保证查找的位置不会大于数组长度,类似于求余查询索引

  3. 【6】【7】通过计算的索引在数组中位置数据为null,则在该索引位置创建新的节点

  4. 【9-35】获取已存在的节点

  5. 【9-11】要查询的节点位于数组或者说链表的第一个

  6. 【13-14】如果是红黑树,则调用红黑树中的put方法获取要查询的节点

  7. 【16-27】链表查询节点

  8. 【19-20】如果某一个链表的节点数>=TREEIFY_THRESHOLD-1,则改为红黑树存储

总结:

    hashmap的数据结构为hash表,具体结构如下:

    

    第一行为数组,通过求hash值与数组的大小的位运算求得索引定位数据;添加数据的时候,检查每个桶的数据大小,如果超过8(默认)个,则将链表修改为红黑树存储;添加完数据检查数组大小,如有必要,重置数组大小(resize())

© 著作权归作者所有

上一篇: jsp中的Html转义
下一篇: 开源许可证
清尘V

清尘V

粉丝 41
博文 107
码字总数 47780
作品 0
青岛
程序员
私信 提问
Java8之HashMap源码分析

高级Java架构交流群:283943715 java高级交流群 一、前言   在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化,其中最重要的一个...

小炎哥
2017/06/19
419
1
Java8 HashMap实现原理探究

前言:Java8之后新增挺多新东西,在网上找了些相关资料,关于HashMap在自己被血虐之后痛定思痛决定整理一下相关知识方便自己看。图和有些内容参考的这个文章:http://www.importnew.com/1659...

任杰LL
2016/03/02
254
0
HashMap详解(一). put方法详解

JAVA8 1.HashMap.put 方法实现了Map.put(K key,V value)的方法。直接调用内部方法 大致思路是这样的: 对key的hashCode()进行hash后计算数组下标index; 如果当前数组table为null,进行resiz...

努力学的程序员
2017/11/02
0
0
Java8 HashMap详解

Java8 HashMap Java8 对 HashMap 进行了一些修改,最大的不同就是利用了红黑树,所以其由 数组+链表+红黑树 组成。 根据 Java7 HashMap 的介绍,我们知道,查找的时候,根据 hash 值我们能够...

sihailoveyan
2018/02/27
0
0
面试之HashSet之源码剖析

1、最近的面试都问到了hashset存入实现同一类的两个对象,如果要去重要怎么做: 重写equal方法或hashcode方法,也就是说判断两个对象是否相等用到的是Object类的equals方法,而equals源码是...

无极之岚
01/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C# 视频多人脸识别的实现过程

整个项目是用虹软技术完成开发 上一篇内容的调整,提交到git了,https://github.com/catzhou2002/ArcFaceDemo 基本思路如下: 一、识别线程 1.获取当前图片 2.识别当前图片的人脸位置,并将结...

是哇兴哥棒棒哒
32分钟前
1
0
Spring Cloud Eureka 你还在让它裸奔吗??

前些天栈长在微信公众号Java技术栈分享了 Spring Cloud Eureka 最新版 实现注册中心的实战教程:Spring Cloud Eureka 注册中心集群搭建,Greenwich 最新版!,成功进入 Eureka 控制台页面。 ...

Java技术栈
48分钟前
1
0
linux gyp ERR! stack Error: EACCES: permission denied, mkdir ‘xxx’

在使用linux npm install的出现这个错误了,百度了下,没有权限加个参数即可 npm install --unsafe-perm

朝如青丝暮成雪
49分钟前
2
0
使用kubeadm 搭建K8s集群

1. 参考官网 https://kubernetes.io/docs/setup/independent/install-kubeadm/ 2. 初始化master节点 (1)kubeadm init --kubernetes-version=$(hostname -i) --kubernetes-version=v1.14.1......

whhbb
今天
3
0
Dubbo 3.0 !提升不止一点点!

Dubbo 自 2011 年 10 月 27 日开源后,已被许多非阿里系的公司使用,其中既有当当网、网易考拉等互联网公司,也不乏中国人寿、青岛海尔等大型传统企业。 自去年 12 月开始,Dubbo 3.0 便已正...

编程SHA
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部