Java中常见数据结构Map之HashMap
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
public V put(K key, V value) {return 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;//如果当前map中无数据,执行resize方法。并且返回nif ((tab = table) == null || (n = tab.length) == 0)n = (tab = resize()).length;//如果要插入的键值对要存放的这个位置刚好没有元素,那么把他封装成Node对象,放在这个位置上就完事了if ((p = tab[i = (n - 1) & hash]) == null)tab[i] = newNode(hash, key, value, null);//否则的话,说明这上面有元素else {Node<K,V> e; K k;//如果这个元素的key与要插入的一样,那么就替换一下,也完事。if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))e = p;//1.如果当前节点是TreeNode类型的数据,执行putTreeVal方法else if (p instanceof TreeNode)e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);else {//还是遍历这条链子上的数据,跟jdk7没什么区别for (int binCount = 0; ; ++binCount) {if ((e = p.next) == null) {p.next = newNode(hash, key, value, null);//2.完成了操作后多做了一件事情,判断,并且可能执行treeifyBin方法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 keyV oldValue = e.value;if (!onlyIfAbsent || oldValue == null) //true || --e.value = value;//3. afterNodeAccess(e);return oldValue;}}++modCount;//判断阈值,决定是否扩容if (++size > threshold)resize();//4. afterNodeInsertion(evict);return null; }
![](/assets/blank.gif)
private void writeObject(java.io.ObjectOutputStream s)throws IOException {Iterator<Map.Entry<K,V>> i =(size > 0) ? entrySet0().iterator() : null;// Write out the threshold, loadfactor, and any hidden stuff s.defaultWriteObject();// Write out number of buckets s.writeInt(table.length);// Write out size (number of Mappings) s.writeInt(size);// Write out keys and values (alternating)if (size > 0) {for(Map.Entry<K,V> e : entrySet0()) {s.writeObject(e.getKey());s.writeObject(e.getValue());}} }
private void readObject(java.io.ObjectInputStream s)throws IOException, ClassNotFoundException {// Read in the threshold (ignored), loadfactor, and any hidden stuff s.defaultReadObject();if (loadFactor <= 0 || Float.isNaN(loadFactor))throw new InvalidObjectException("Illegal load factor: " +loadFactor);// set hashSeed (can only happen after VM boot)Holder.UNSAFE.putIntVolatile(this, Holder.HASHSEED_OFFSET,sun.misc.Hashing.randomHashSeed(this));// Read in number of buckets and allocate the bucket array;s.readInt(); // ignored// Read number of mappingsint mappings = s.readInt();if (mappings < 0)throw new InvalidObjectException("Illegal mappings count: " +mappings);int initialCapacity = (int) Math.min(// capacity chosen by number of mappings// and desired load (if >= 0.25)mappings * Math.min(1 / loadFactor, 4.0f),// we have limits... HashMap.MAXIMUM_CAPACITY);int capacity = 1;// find smallest power of two which holds all mappingswhile (capacity < initialCapacity) {capacity <<= 1;}table = new Entry[capacity];threshold = (int) Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);useAltHashing = sun.misc.VM.isBooted() &&(capacity >= Holder.ALTERNATIVE_HASHING_THRESHOLD);init(); // Give subclass a chance to do its thing.// Read the keys and values, and put the mappings in the HashMapfor (int i=0; i<mappings; i++) {K key = (K) s.readObject();V value = (V) s.readObject();putForCreate(key, value);} }
![](/assets/blank.gif)
![](/assets/blank.gif)
Java中常见数据结构Map之HashMap相关推荐
- Java中常见数据结构Map之LinkedHashMap
前面已经说完了HashMap, 接着来说下LinkedHashMap. 看到Linked就知道它是有序的Map,即插入顺序和取出顺序是一致的, 究竟是怎样做到的呢? 下面就一窥源码吧. 1, Link ...
- Java中常见数据结构:list与map
1 1:集合 2 Collection(单列集合) 3 List(有序,可重复) 4 ArrayList 5 底层数据结构是数组,查询快,增删慢 6 线程不安全,效率高 7 Vector 8 底层数据 ...
- java中常见的数据结构分类
自己总结了下java中常见的数据结构和分类 在这里,我总结了list中数据结构对应我们所学的线性表,属于顺序存储还是链式存储,但没有总结set数据结构对应我们所学的哪一种(按理说应该是集合),是因为t ...
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
- java中的数据结构之HashMap学习
java中的数据结构之HashMap学习 equal与hashcode equals与hashcode的源码 为什么hashmap中作为键值的类要重写hashcode和equals方法 Integer ...
- 动图 + 源码,演示 Java 中常用数据结构执行过程及原理
最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...
- [转]详细介绍java中的数据结构
详细介绍java中的数据结构 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类.一起来看本文吧! 也许你已经熟练使用了java.util包里面的各 ...
- 数据结构中缀表达式转后缀表达式与后缀表达式的求值实训报告_动图+源码,演示 Java 中常用数据结构执行过程及原理...
程序员的成长之路互联网/程序员/成长/职场 关注 阅读本文大概需要 3.7 分钟. 作者:大道方圆cnblogs.com/xdecode/p/9321848.html 最近在整理数据结构方面的知识, ...
- Java中List和Map接口之间的区别
列表与地图界面 (List vs Map interface) Here, we will see how List differs from Map interface in Java and we ...
最新文章
- 第十五届全国大学生智能汽车竞赛室外光电组全国总决赛方案
- 无法定位软件包_使用Degraph管理软件包依赖关系
- [UWP]涨姿势UWP源码——Unit Test
- Boost.Signals2 的初学者你好世界示例
- python 如何放心干净的卸载模块
- ASP.NET Core 3.x - 为什么采用新的 Endpoint Routing 路由系统
- JVM自动内存管理机制——Java内存区域(下)
- html怎么移动到vue,vue自定义指令之拖动页面的元素
- 记一次css载入指定url失败
- less,more,view一个文件时中文可以正常显示,可是VI却显示乱码呢?
- [Linux] 学习笔记之安装学习环境(sshd, lrzsz)
- DynamipsGUI 模拟pix防火墙
- 易语言5.9 免狗完美版下载+安装教程
- 计算机网络的常用命令汇总
- 汇编环境搭建 -- MASM32
- 利用Epplus将数据导出到Excel
- 最优二叉查找树,动态规划法,二维表,填表优化,代码
- Kafka配置broker映射错误报错Discovered coordinator xxx rack: null
- 阿里云天池龙珠计划 sql篇---stack06
- 手机号码清洗的优势是什么
热门文章
- 八、进程调度的时机、切换与过程,调度方式
- 重温目标检测--YOLO v1
- 【Harvest源码分析】GetFourZeroCrossingIntervals函数
- LeetCode 268. Missing Number--Python解法--数学题
- LeetCode 421. Maximum XOR of Two Numbers in an Array--Python解法
- 记录在Ubuntu14.04上安装ryu中遇到的各种坑
- Linux命令查看服务器信息
- linux 保存编译log,(转)Linux下编译安装log4cxx
- python中立方_Python编程从入门到实践 第四章练习题
- 编写100多行的c语言程序,C语言编程100多例.doc