本文主要有以下几点内容
- HashMap的底层结构
- HashMap和HashTable的不同
- HashMap为什么线程不安全
- 多线程环境怎么使用HashMap
- 哈希分布
一、首先我们来看看HashMap的底层结构
- 哈希表
- 箱(bin)或者桶(bucket)
HashMap的数据结构可看做是分桶(分箱)的哈希表,可称为哈希桶。即按照key(键)的哈希值分桶。桶的大小跟冲突有关,碰撞的key多,桶就大,反之桶就小。
桶的基本单元:Node<K,V> 组成normal 桶、TreeNode<K,V> 组成tree 桶
冲突不多(未超过门限设定门限)时,桶就普通的Node<K,V>桶。当冲突太多,桶变得很大时(超过设定门限)桶就变成TreeNode<K,V>桶。
为什么会有TreeNode:
因为TreeNode和TreeMap一样,存储的是经过排序的对象,在容量较大(冲突较多)的情况下,取出目标对象的速度要比遍历链表快的多。当然normal 桶变成tree 桶随之带来的也有复杂性,是一种牺牲空间换时间的方法,不过这在key的哈希分布非常糟糕的情况下是值得的。
二、HashMap和HashTable的不同
JDK中明显说明,Ha