JDK1.8 HashMap 总结 源码

JDK1.8 HashMap 总结

HashMap 是无论在工作还是面试中都非常常见常考的数据结构。比如 Leetcode 第一题 Two Sum 的某种变种的最优解就是需要用到 HashMap 的,高频考题 LRU Cache 是需要用到 LinkedHashMap 的。 随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。
阅读全文

volatile关键字解析

## volatile关键字的两层语义 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 2)禁止进行指令重排序。 ## volatile保证原子性吗? volatile关键字保证了操作的可见性,但是volatile不保证原子性。 * 保证单次读或单次写操作的原子性。 * 不保证自增操作或多次读写操作的顺序性, 也就没办法保证原子性
阅读全文

HashMap、HashTable、ConcurrentHashMap的差异

## 一、HashMap和Hashtable有何不同? ### 线程安全 Hashtable 中的方法是同步的,而HashMap中的方法在默认情况下是非同步的。 在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。 ### 继承关系 Hashtable是基于陈旧的Dictionary类继承来的。 HashMap继承的抽象类AbstractM
阅读全文

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
阅读全文

JDK 1.6和JDK 1.7中substring的原理及区别

> String的subString方法作用: 截取字符串并返回其[beginIndex,endIndex-1]范围内的内容。 ## 分析 我们知道,因为字符串的不可变性,当使用 x.substring(1,3) 对x赋值的时候,它会指向一个全新的字符串。 但是在jdk6 和 jdk7中调用substring时处理逻辑并不一样。 ### JDK 6中的substring String是通过字符
阅读全文

JDK1.8 HashMap源码解析 树形结构修剪

# 树形结构修剪 split() HashMap 中, 当扩容时,如果当前桶中元素结构是红黑树,并且元素个数小于链表还原阈值 UNTREEIFY_THRESHOLD (默认为 6),就会把桶中的树形结构缩小或者直接还原(切分)为链表结构,调用的就是 split()。 ```java /** * Splits nodes in a tree bin into lower and upper
阅读全文

HashMap 测试「链表转红黑树以及扩容」

# 准备 首先创建了类 TreeNodeHashMap, 提供内部类MapKey。 ``` MapKey:重写了hashCode使得hashCode碰撞极高. 在hashCode() 中,所有数字,hashCode全部给1,为了复现碰撞极高, 且更容易树化(超过8)。 非数字的均为2. 由于在TreeNodeHashMap测试的key都为数字,所以每次key的hashCode都相同, 都为1.实现
阅读全文
本文目录
    Loading...