Java中常见数据结构Map之HashMap
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; }
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);} }
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 ...
最新文章
- 关于Cloud各种组件的停更/升级/替换
- boost::interprocess::basic_vectorstream用法的测试程序
- 查什么攻略?百行 Python 代码告诉你国庆哪些景点爆满!
- 在php中isset什么意思,php – isset()和__isset()之间有什么区别?
- Java中设计模式之装饰者模式-3
- 深入理解JVM虚拟机之内存管理
- 机房收费系统之实现图(组件图、部署图)
- 写歌词的技巧和方法,写歌词的基本要求,歌词创作基本知识及注意事项,创作歌词的要点
- 计算机操作系统知识点总结
- vivado中bit文件怎么没有生成_【新手入门】ISE工程升级到Vivado及板级信号调试技术...
- 也谈VC中ModifyStyleModifyStyleEx无法改变控件的Style)
- 关于MemoryBarrier
- ps里面的css,PS中如何添加图层样式
- 计算机网络数据传输率的基本单位是,计算机网络中,数据的传输速度常用的单位是什么...
- JS 如何清除页面缓存
- 焊武帝再爆肝造CPU,软硬件全自研,可玩游戏,基础器件成本不到1000元
- FFmpeg源码分析:swr_convert()音频格式转换
- BI是什么,BI的解释
- 字体图标的引入和使用-svg是个好东西
- 读书笔记:人工智能基础(高中版)
热门文章
- Jupyter Notebook教程
- 12.前K个高频元素---使用优先队列和哈希表解决
- 语义分割--Mix-and-Match Tuning for Self-Supervised Semantic Segmentation
- 【puthon】把大量csv文件写入h5文件制作数据集
- Java源码详解六:ConcurrentHashMap源码分析--openjdk java 11源码
- ImportError: Failed to import `pydot`. Please install `pydot`. For example with `pip install pydot`
- JAVA里tokens意思_Java TokenMetadata.sortedTokens方法代码示例
- python协程异步原理_简单介绍Python的Tornado框架中的协程异步实现原理
- C++_泛型编程与标准库(三)
- k8s 去除master节点污点NoSchedule,添加master节点 尽量不调度