源码 JDK1.8 HashMap 总结 HashMap 是无论在工作还是面试中都非常常见常考的数据结构。比如 Leetcode 第一题 Two Sum 的某种变种的最优解就是需要用到 HashMap 的,高频考题 LRU Cache 是需要用到 LinkedHashMap 的。 随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。 2019-09-19 浏览(503) 评论(1) 阅读全文
volatile关键字解析 ## volatile关键字的两层语义 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 2)禁止进行指令重排序。 ## volatile保证原子性吗? volatile关键字保证了操作的可见性,但是volatile不保证原子性。 * 保证单次读或单次写操作的原子性。 * 不保证自增操作或多次读写操作的顺序性, 也就没办法保证原子性 2020-09-26 浏览(478) 评论(0) 源码 阅读全文
HashMap、HashTable、ConcurrentHashMap的差异 ## 一、HashMap和Hashtable有何不同? ### 线程安全 Hashtable 中的方法是同步的,而HashMap中的方法在默认情况下是非同步的。 在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。 ### 继承关系 Hashtable是基于陈旧的Dictionary类继承来的。 HashMap继承的抽象类AbstractM 2019-10-18 浏览(373) 评论(0) 源码 阅读全文
Java中的增强for循环的实现原理 ## 前言 在JAVA中,遍历集合和数组一般有以下三种形式: ``` // 普通的for循环遍历 for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i) + ","); } // 使用迭代器进行遍历 Iterator iterator = list.iterator(); while (iterator.ha 2019-10-15 浏览(510) 评论(0) 源码 阅读全文
JDK 1.6和JDK 1.7中substring的原理及区别 > String的subString方法作用: 截取字符串并返回其[beginIndex,endIndex-1]范围内的内容。 ## 分析 我们知道,因为字符串的不可变性,当使用 x.substring(1,3) 对x赋值的时候,它会指向一个全新的字符串。 但是在jdk6 和 jdk7中调用substring时处理逻辑并不一样。 ### JDK 6中的substring String是通过字符 2019-10-09 浏览(334) 评论(0) 源码 阅读全文
JDK 1.8 LinkedHashMap 原理与学习 # LinkedHashMap 继承于 HashMap ``` public class LinkedHashMap extends HashMap implements Map ``` 2019-09-19 浏览(331) 评论(0) 源码 阅读全文
JDK1.8 HashMap源码解析 树形结构修剪 # 树形结构修剪 split() HashMap 中, 当扩容时,如果当前桶中元素结构是红黑树,并且元素个数小于链表还原阈值 UNTREEIFY_THRESHOLD (默认为 6),就会把桶中的树形结构缩小或者直接还原(切分)为链表结构,调用的就是 split()。 ```java /** * Splits nodes in a tree bin into lower and upper 2019-09-09 浏览(368) 评论(0) 源码 阅读全文
HashMap 测试「链表转红黑树以及扩容」 # 准备 首先创建了类 TreeNodeHashMap, 提供内部类MapKey。 ``` MapKey:重写了hashCode使得hashCode碰撞极高. 在hashCode() 中,所有数字,hashCode全部给1,为了复现碰撞极高, 且更容易树化(超过8)。 非数字的均为2. 由于在TreeNodeHashMap测试的key都为数字,所以每次key的hashCode都相同, 都为1.实现 2019-08-30 浏览(437) 评论(0) 源码 阅读全文
JDK1.8 HashMap源码解析(五) 红黑树的具体实现方式? toc + JDK1.8 HashMap源码解析 目录 - [JDK1.8 HashMap源码解析(一) 数据结构&初始化](https://muzinuo.com/article/byuan-ma-jie-xi.html) - [JDK1.8 HashMap源码解析(二) 数据赋值 put](https://muzinuo.com/article/b45cuf36os38.html) 2019-08-26 浏览(340) 评论(0) 源码 阅读全文
JDK1.8 HashMap源码解析(四) 为什么HashMap桶中链表长度个数超过8才转为红黑树 + JDK1.8 HashMap源码解析 目录 - [JDK1.8 HashMap源码解析(一) 数据结构&初始化](https://muzinuo.com/article/byuan-ma-jie-xi.html) - [JDK1.8 HashMap源码解析(二) 数据赋值 put](https://muzinuo.com/article/b45cuf36os38.html) 2019-08-15 浏览(472) 评论(2) 源码 阅读全文