源码:

Hash(key):计算出key的hash值。

put方法详解:

1、如果table数组为null或者table数组的长度为0,则调用resize()方法扩容并返回table数组。数组的长度为n,(put时确保table数组不为空且长度不为0)

2、如果table数组不为null且数组的长度不为0,则根据table数组的长度n和key的hash值hash(key),计算出数组下标i,该下标对应的节点名称为p,此时p节点为头节点。

如果p节点为null,则根据hash值、key、value新建一个node节点,直接插入。(如果下标位置节点为空,则新建一个节点放在该下标位置)

其中hash值时key的hashCode()方法算出来的值h的低16位异或高16位算出来的结果,

3、如果table数组不为null且数组的长度不为0,下标i位置的节点p也不为null。

1)、如果p节点的hash值等于hash(key)且p节点的key等于key,将p节点赋值给e节点,即hash值和key均相同时,新的节点覆盖原来的节点,此时e节点不为空。

(如果下标位置有节点,节点的hash值与hash(key)相等且key也相等,则将该下标位置的节点赋值给e节点,此时e节点的value值为旧值。后面再将新添加的value覆盖e节点的value)

2)、如果p节点为红黑树节点,则进行红黑树处理,此时e节点不为空

3)、如果p节点的hash值等于hash(key)但是key不相等且p节点不为红黑树节点,即p节点为链表节点,如果p的下一个节点为空,

则根据hash值、key、value新建一个节点作为p节点的下一个节点,即直接插入,此时e节点不为空,且e节点为新添加的节点。

如果链表长度超出8时,则执行红黑树逻辑。

如果p的下一个节点e不为空且e节点的hash值等于hash(key)但是key不相等,则将e赋值给p节点,指向下一个寻找的节点。如果key相等,后面再用新添加的value覆盖e节点的value

4、如果e节点不为空且e节点的value值不为空,则将新添加的value覆盖e节点的value。

简述如下:如果table数组为null或者table数组的长度为0,则调用resize()方法扩容并返回table数组,数组的长度为n;根据table数组的长度n和key的hash值hash(key),计算出数组下标i,如果如果下标处头节点为null,则根据hash值、key、value新建一个node节点,直接插入。如果头节点不为null且为红黑树节点,则进行红黑树处理;如果头节点不为null且头节点的hash值相等且key也相等,则用新的节点覆盖旧的节点;如果头节点的hash值相等但是key不相等且头节点的下一个节点为空时,则根据hash值、key、value新建一个节点作为p节点的下一个节点,即直接插入。如果头节点的下一个节点不为空且hash值相等且key相等时,则用新的节点覆盖旧的节点;如果头节点的下一个节点不为空且hash值相等但key不相等时,指向下一个寻找的节点

put 方法执行逻辑的图:

谈一下hashMap中put是如何实现的?的更多相关文章

  1. HashMap中的hash算法中的几个疑问

    HashMap中哈希算法的关键代码 //重新计算哈希值 static final int hash(Object key) { int h; return (key == null) ? 0 : (h ...

  2. 再谈SQL Server中日志的的作用

    简介     之前我已经写了一个关于SQL Server日志的简单系列文章.本篇文章会进一步挖掘日志背后的一些概念,原理以及作用.如果您没有看过我之前的文章,请参阅:     浅谈SQL Server ...

  3. 转: 浅谈C/C++中的指针和数组(二)

    转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...

  4. 转:浅谈C/C++中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...

  5. 转载 浅谈C/C++中的static和extern关键字

    浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T   static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...

  6. 如果两个对象具有相同的哈希码,但是不相等的,它们可以在HashMap中同时存在吗?

    如果两个对象具有相同的哈希码,但是不相等的,它们可以在HashMap中同时存在吗? ----答案是 可以 原因: 在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了h ...

  7. 遍历并remove HashMap中的元素时,遇到ConcurrentModificationException

    遍历并remove HashMap中的元素时,遇到ConcurrentModificationException for (Map.Entry<ImageView, UserConcise> ...

  8. [改善Java代码]减少HashMap中元素的数量

    在系统开发中我们经常会使用HashMap作为数据集容器,或者是用缓冲池来处理,一般很稳定,但偶尔也会出现内存溢出的问题(OutOfMemory错误),而且这经常是与HashMap有关的.而且这经常是与 ...

  9. Java学习笔记--HashMap中使用object做key的问题【转】

    在HashMap中,如果需要使用多个属性组合作为key,可以将这几个属性组合成一个对象作为key.但是存在的问题是,要做get时,往往没办法保存当初put操作时的key object的referenc ...

随机推荐

  1. .net core 和 WPF 开发升讯威在线客服与营销系统:使用线程安全的 BlockingCollection 实现高性能的数据处理

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf.shengxunwei.com 注意 ...

  2. go-zero解读与最佳实践(上)

    本文有『Go开源说』第三期 go-zero 直播内容修改整理而成,视频内容较长,拆分成上下篇,本文内容有所删减和重构. 大家好,很高兴来到"GO开源说" 跟大家分享开源项目背后的一 ...

  3. php之PDO连接mysql数据库,增删改查等等操作实例

    我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严就有SQL注入风险,导致网站被攻击. 虽然可以用mysql_real_escape_string ...

  4. 牛客15334 Easygoing Single Tune Circulation(后缀自动机+字典树)

    传送门:Easygoing Single Tune Circulation 题意 给定n个字符串 s[i],再给出m个查询的字符串 t[i],问 t[i] 是否为某个 s[i] 循环无限次的子串. 题 ...

  5. Codeforces Round #604 (Div. 2) A. Beautiful String(贪心)

    题目链接:https://codeforces.com/contest/1265/problem/A 题意 给出一个由 a, b, c, ? 组成的字符串,将 ? 替换为 a, b, c 中的一个字母 ...

  6. 【poj 2115】C Looooops(数论--拓展欧几里德 求解同余方程 模版题)

    题意:有一个在k位无符号整数下的模型:for (variable = A; variable != B; variable += C)  statement; 问循环的次数,若"永不停息&q ...

  7. CQRS+Event Sourcing

    using System; using System.Collections.Generic; using System.Linq; namespace CQRS { public class Eve ...

  8. Gitlab忘记root用户密码解决办法

    一.Gitlab忘记root用户密码,重置用户密码和查看用户ID号方法  1.Gitlab查看用户id号的方法1)方法1:通过api接口查询接口查询地址:http://gitlab的url/api/v ...

  9. codeforces 1039B Subway Pursuit【二分+随机】

    题目:戳这里 题意:一个点在[1,n]以内,我们可以进行4500次查询,每次查询之后,该点会向左或向右移动0~k步,请在4500次查询以内找到该点. 解题思路:一边二分,一边随机. 交互题似乎有好多是 ...

  10. Asp.Net Core Grpc 入门实践

    Grpc简介 gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. 在 gRPC 中,客户端应用程序可以直接调用不同计算机上的服务器应用程序上的方法,就像它是本地对象一样,从而更轻松地创 ...