为什么80%的码农都做不了架构师?>>>   

PUT:

1.先对key的hashCode()做hash,然后计算index。

2.如果没碰撞直接放到bucket中。

3.如果碰撞了,以链表的形式存在buckets后。

4.如果碰撞导致链表过长,就把链表转换成红黑树。

5.如果节点已经存在就替换old value(保证key的唯一性)。

6.如果bucket满了(超过load factor*current capacity),就要resize。

public V put(K key, V value) {// 对key的hashCode()做hashreturn putVal(hash(key), key, value, false, true);
}
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {Node<K,V>[] tab; Node<K,V> p; int n, i;// tab为空则创建if ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length;// 计算index,并对null做处理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 1sttreeifyBin(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 keyV oldValue = e.value;if (!onlyIfAbsent || oldValue == null)e.value = value;afterNodeAccess(e);return oldValue;}}++modCount;// 超过load factor*current capacity,resizeif (++size > threshold)resize();afterNodeInsertion(evict);return null;
}

GET:

1.bucket里的第一个节点,直接命中;

2.如果有冲突,则通过key.equals(k)去查找对应的entry

3.若为树,则在树中通过key.equals(k)查找,O(logn);

4.若为链表,则在链表中通过key.equals(k)查找,O(n)。

public V get(Object key) {Node<K,V> e;return (e = getNode(hash(key), key)) == null ? null : e.value;
}
final Node<K,V> getNode(int hash, Object key) {Node<K,V>[] tab; Node<K,V> first, e; int n; K k;if ((tab = table) != null && (n = tab.length) > 0 &&(first = tab[(n - 1) & hash]) != null) {// 直接命中if (first.hash == hash && // always check first node((k = first.key) == key || (key != null && key.equals(k))))return first;// 未命中if ((e = first.next) != null) {// 在树中getif (first instanceof TreeNode)return ((TreeNode<K,V>)first).getTreeNode(hash, key);// 在链表中getdo {if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))return e;} while ((e = e.next) != null);}}return null;
}

转载于:https://my.oschina.net/134596/blog/1800725

HashMap的put和get操作相关推荐

  1. hashmap头插法和尾插法区别_Java程序员必知:HashMap进行put操作会不会引起死循

    HashMap进行put操作会引起死循环? 最近在磕<java并发编程艺术>,在看到第六章的时候出现了下面这段我不是很理解的东西,如下 <java并发编程艺术>截取 为什么要使 ...

  2. HashMap源码实现分析

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 一.前言 HashMap 顾名思义,就是用hash表的原理 ...

  3. Java8的集合:HashMap的实现原理

    概述 哈希表是基于 Map 接口的实现的,它允许 null 值和null 键,它不是线程同步的,同时也不保证有序. Map的这种实现方式为 get(取)和 put(存)带来了比较好的性能.但是如果涉及 ...

  4. HashMap 在并发下可能出现的问题分析!

    我们都知道,HashMap在并发环境下使用可能出现问题,但是具体表现,以及为什么出现并发问题,可能并不是所有人都了解 这篇文章记录一下HashMap在多线程环境下可能出现的问题以及如何避免. 在分析H ...

  5. Java源码详解二:HashMap源码分析--openjdk java 11源码

    文章目录 HashMap.java介绍 1.HashMap的get和put操作平均时间复杂度和最坏时间复杂度 2.为什么链表长度超过8才转换为红黑树 3.红黑树中的节点如何排序 本系列是Java详解, ...

  6. 第一回写的用arraylist模拟栈操作

    package hashMap; import java.util.ArrayList; import d.Student; /*** 用ArrayList模拟栈操作* @author zhujiab ...

  7. 常见面试题:为什么HashMap不是线程安全的呢?(JDK1.7和JDK1.8角度)(看完你就能和面试官笑谈人生了)

    title: 常见面试题:为什么HashMap不是线程安全的呢?(JDK1.7和JDK1.8角度)(看完你就能和面试官笑谈人生了) tags: 面试常见题 常见面试题:为什么HashMap不是线程安全 ...

  8. python 线程安全链表_教你用 Python 实现 HashMap 数据结构

    <犬夜叉·镜中的梦幻城> 今天这篇文章给大家讲讲hashmap,这个号称是所有Java工程师都会的数据结构.为什么说是所有Java工程师都会呢,因为很简单,他们不会这个找不到工作.几乎所有 ...

  9. 【Java源码分析】HashMap源码分析

    类的定义 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Clone ...

最新文章

  1. 如何欣赏一个深度学习框架?
  2. 彩色RGB图像转为灰度图像
  3. LNMP环境运行laravel open_basedir restriction in effect 问题
  4. Sqoop(三)将关系型数据库中的数据导入到HDFS(包括hive,hbase中)
  5. atomic原子类实现机制_深入了解Java atomic原子类的使用方法和原理
  6. 计算机的只读储存器,只读存储器
  7. emacs扩展功能_3个用于组织的Emacs扩展
  8. php网站 只显示sinsiu_sinsiu_cms_1_0_10
  9. Centos在线安装nginx
  10. java feature类_Java FeatureCollection类代码示例
  11. Facebook开源问答系统DrQA:基于单一信源回答开放域提问
  12. Python urllib爬取百度首页
  13. 高中计算机考试编程题,高中信息技术《算法及程序设计》试题.docx
  14. 按键1按下数码管显示1,按键2按下数码管显示2,按键3按下8个LED灯实现流水灯效果;
  15. python你TM太皮了——区区30行代码就能记录键盘的一举一动
  16. mongodb数据库添加账号
  17. 报错:<ly-tab> - did you register the component correctly? For recursive components, make sure to provi
  18. Hadoop垃圾回收站与YARN日志聚合
  19. 如何使用Sheffield大学的Matlab GA遗传算法工具箱
  20. 超好看的css动画特效实现

热门文章

  1. axios设置text html,axios封装动态设置Content-Type
  2. android仿qq聊天项目点评,android 实现qq聊天对话界面效果
  3. 初识、理解适配器模式
  4. 英特尔双倍功耗换性能,放话12代酷睿i9超越M1 Max,网友:可以煎鸡蛋了?
  5. Homebrew存在大漏洞,恶意代码远程操纵电脑! 网友:这不是单方面的责任
  6. 日本人真会玩!3天众筹60万元来造“机器猫”,会说话摇尾巴的那种
  7. 谷歌开源预训练新范式BiT,准确率提高近25%!网友评价:CV界的BERT
  8. MIT媒体实验室主任辞去一切职务:拿了爱泼斯坦170万美金,涉及程序违规,麻省理工宣布彻查...
  9. 只用2页纸,北大数学校友攻破计算机30年难题!过程浅显直白,看懂仅需线性代数基础...
  10. MRI原理谁都看得懂版