1. HashMap是数组加链表组成,当链表多长则转成红黑树,树状结构。
2. Node对象记录值,根据hash的值,自己记录自己的落点位置。
final int hash; //记录hash算法之后的整型数,hash算法就是(
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
) final K key; V value; Node<K,V> next;//单向链表
Node node = new Node();
Node[] tables;//成员
3. 深层次理解
key value 封装成Node()节点
解决节点位置 location,计算数组的大小,数组默认大小是16,
落点算法:
a.希望得到一个整型数 int i = Object.hashCode()
b.根据这个控制范围 0~15之间 i%16取余
4.put的过程中先初始化数组,但是有个线程安全的问题
在HashMap中可以用hashTable去解决线程安全,hashTable中put是用到了synchroized;
ConcurrentHashMap中put方法中,运用Volatile 解决共享变量的可见性 ;
扩容标准16*0.75=12,超过12则扩容;
5.put 线程安全问题
(1)当我们想数组插入元素时,此时采用的是CAS无锁化的方式
(2)往数组下面的节点走的时候。替换,链表,红黑树
(3)下面的数组线程安全问题用Synchroized同步锁进行控制,同步代码块。