在Map中key-value组合成Map.Entry对象存放,所有的Entry存放在数组table中
/** * The table, resized as necessary. Length MUST Always be a power of two. */ transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;
HashMap中Entry的结构如下:
final K key; V value; Entry<K,V> next; int hash;
可以看出,相同hashCode的key会以链表的形式存放在table的同一个slot中。
HashMap中可以存放null,null存放在table[0]中
/** * Offloaded version of put for null keys */ private V putForNullKey(V value) { for (Entry<K,V> e = table[0]; e != null; e = e.next) { if (e.key == null) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(0, null, value, 0); return null; }
从此可以看出,在HashMap中,null只会有一个value。
public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) return putForNullKey(value); int hash = hash(key); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }
从put方法可以看出,相同hashCode的所有key占用同一个slot,并以链表的形式存在。
public V get(Object key) { if (key == null) return getForNullKey(); Entry<K,V> entry = getEntry(key); return null == entry ? null : entry.getValue(); } final Entry<K,V> getEntry(Object key) { if (size == 0) { return null; } int hash = (key == null) ? 0 : hash(key); for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) return e; } return null; }
从get方法可以看出,如果(k = e.key) == key,即是同一个对象的引用(不管该对象是否在put后发生变化,这是通过equals方法的结果可能不同了)都会去除e.key中的e.value。否则就需要调用它们的equals方法来判断是否相同。
相关推荐
HashMap的put逻辑(1.7) .svg
HASHMap迭代集合的例子好用,逻辑算法
对HashMap的put方法的源码进行详细解读,分析put方法源码中的内在逻辑关系,欣赏源码独特之美,从中学习更为精致的编程思维
主要介绍了Java HashMap 如何正确遍历并删除元素的方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java7-8中的 HashMap和ConcurrentHashMap全解析 如果你想了解底层的逻辑就来看看吧
在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能的关键。由于本人接触了一个有关性能与逻辑同时并存的问题,于是就开始研究这方面的问题。找遍了大大小小的论坛,也把《Java 虚拟机规范...
hashmap源码 Table Of Contents day01_JAVA语言概述与基本语法:标识符、变量也变量分类、源码_反码_补码、进制转换、编码与字符集 day02_基本语法.运算符:算术运算符、赋值运算符、比较运算符、逻辑运算符、位...
主要介绍了从源码的角度浅析HashMap、TreeMap元素的存储和获取元素的逻辑;从Map与Set之间的关系浅析常用的Set中元素的存储和判断是否重复的逻辑,需要的朋友可以参考下
做项目写业务逻辑的时候经常用到的数据结构有2个,一个是动态数组还一个是字典。大部分编程语言,都有提供上述两种数据结构的集合类标准库。但是c语言是没有提供这类标准库的,本资源提供的是一个可以在正式项目中...
一些华为的逻辑思维面试题,包括一部分代码编程题。可以看啊可能
SimpleCacheA Cache framework for java and android application, objects are store in key-value pair in memory,value can be...使用HashMap进行存储,键为String,值可以为任意对象类型,如String,List,Map等。当
2.7版(2020.4.7) 1) 调整 添加() 方法. 增加可选参数 参_不覆盖 (当键值存在时不进行值覆盖) ... 1) 修复 取值的键数组 逻辑值获取失败问题。 2) 调整 长整数键的哈希计算调整为单独的方法调用,减少些汇编代码。
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 11、HashMap和Hashtable的区别。 HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空...
1) 添加 取值时可提供一个逻辑参考参数,保存取值状态结果。2) 添加 支持自定义数据值, 以及使用范例(用法比较另类)。0.4版(2018.11.22)。1) 修复 由于WIN10下,文本比较SSE4.2会产生奔溃,屏蔽掉文本比较SSE4.2。...
· table的索引在逻辑上叫做“桶”(bucket),它存储了链表的第一个元素。 · key的hashcode()方法用来找到Entry对象所在的桶。 · 如果两个key有相同的hash值,他们会被放在table数组的同一个桶里面。 · key的...
但有时并不方便停止程序调试,或有些逻辑错误不是简单的单步跟踪可以解决的。此外,还有时程序在客户的机器上,没有调试环境。再者,有时就是希望输出一些信息,来判断某些程序的状态。 我做了一个程序用消息传递...
hashmap源码 CoreHighLevel 课程来源: 高级特性: 换算 字节 (byte):8个二进制位为一个字节(B),最常用的单位。计算机存储单位一般用B,KB,MB,GB,TB,PB,EB,ZB,YB,BB来表示,它们之间的关系是: 1B...
JAVA实现基于知识图谱的古诗词智能问答 使用java+ssm+springboot+maven+...8、确定问题模板后,根据对应的服务层逻辑,调用数据库连接层,去图数据库Neo4j中查找问题的答案 9、将返回结果进行处理,返回至前端输出
类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap 序列化和反序列化 可变参数 类型通配符 ...
搜集整理制作成chm格式文件,灰常给力 8、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 EJB包括Session Bean、Entity Bean...11、HashMap和Hashtable的区别。