谈一下hashMap中put是如何实现的?
源码:

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是如何实现的?的更多相关文章
- HashMap中的hash算法中的几个疑问
HashMap中哈希算法的关键代码 //重新计算哈希值 static final int hash(Object key) { int h; return (key == null) ? 0 : (h ...
- 再谈SQL Server中日志的的作用
简介 之前我已经写了一个关于SQL Server日志的简单系列文章.本篇文章会进一步挖掘日志背后的一些概念,原理以及作用.如果您没有看过我之前的文章,请参阅: 浅谈SQL Server ...
- 转: 浅谈C/C++中的指针和数组(二)
转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...
- 转:浅谈C/C++中的指针和数组(一)
再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...
- 转载 浅谈C/C++中的static和extern关键字
浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...
- 如果两个对象具有相同的哈希码,但是不相等的,它们可以在HashMap中同时存在吗?
如果两个对象具有相同的哈希码,但是不相等的,它们可以在HashMap中同时存在吗? ----答案是 可以 原因: 在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了h ...
- 遍历并remove HashMap中的元素时,遇到ConcurrentModificationException
遍历并remove HashMap中的元素时,遇到ConcurrentModificationException for (Map.Entry<ImageView, UserConcise> ...
- [改善Java代码]减少HashMap中元素的数量
在系统开发中我们经常会使用HashMap作为数据集容器,或者是用缓冲池来处理,一般很稳定,但偶尔也会出现内存溢出的问题(OutOfMemory错误),而且这经常是与HashMap有关的.而且这经常是与 ...
- Java学习笔记--HashMap中使用object做key的问题【转】
在HashMap中,如果需要使用多个属性组合作为key,可以将这几个属性组合成一个对象作为key.但是存在的问题是,要做get时,往往没办法保存当初put操作时的key object的referenc ...
随机推荐
- kafka的演进历史
首先如果我开始做一个消息队列,最开始的时候可能就是一台单机上的一个单一的log日志,不断地向这个日志中追加消息即可. 后来,可能由于一个log日志支撑不了太多的读写请求,于是就对这个log日志进行了拆 ...
- linux(1)Mac上传文件到Linux服务器
前言 我们使用mac时,想让本地文件上传至服务器,该怎么办呢 windows系统,我们可以使用xftp或者rz命令,那么mac呢? mac系统,我们可以使用sftp.scp或者rz命令,本文介绍sft ...
- Kwp2000协议的应用(硬件原理使用篇)
作者:良知犹存 转载授权以及围观:欢迎添加微信:becom_me 发现K线没有过多的文章描述,作为一个开发过K线的人,不写些文章帮助后来的人岂不是太浪费开发经验了呢. 总述 KWP2000是一 ...
- mitmproxy使用详解
mitmproxy 相比Charles.fiddler的优点在于,它可以命令行方式或脚本的方式进行mock mitmproxy不仅可以像Charles那样抓包,还可以对请求数据进行二次开发,进入高度二 ...
- Codeforces Round #628 (Div. 2) A. EhAb AnD gCd(LCM & GCD)
题意: GCD(a,b) + LCM(a,b) = n,已知 n ,求 a,b. 思路: 设 gcd(a, b) = k, a = xk, b = yk , k + ab / k = n xy = n ...
- Codeforces Round #665 (Div. 2) D. Maximum Distributed Tree (dfs计数,树)
题意:给你含有\(n\)个节点,\(n-1\)条边的树,以及\(m\)个质数和\(1\),你需要在这\(m\)个质数和一个\(1\)选择数(质数只能选一次,\(1\)可以多选)给\(n-1\)条边赋值 ...
- Codeforces Round #494 (Div. 3) D. Coins and Queries (贪心,数学)
题意:给你一组全是\(2^d\ (d\ge0)\)的数,询问q次,每次询问一个数,问这个数是否能够由原数组中的数相加得到,如果能,输出最少用多少个数,否则输出\(-1\). 题解:首先贪心得出结论:如 ...
- JavaScript——DOMM
文本节点 != 文本内容
- - 迷宫问题 POJ - 3984 bfs记录路径并输出最短路径
定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...
- [Python] Pandas的delete、drop函数的用法
目录 drop函数 Axis(轴)含义 drop用法实验 delete函数 drop函数 DataFrame.drop(labels=None, axis=0, index=None, columns ...