底层是基于数组+链表实现的,真正存放数据的是entry<k,v>的数组数组
当不一样的对象发生碰撞时,HashMap经过单链表来解决,将新元素加入<链表>表头(头插法),经过next指向原有的元素。单链表在Java中的实现就是对象的引用(复合)。安全
对大链表进行了优化,超过阈值后将链表修改成红黑树后查询效率大大增长(当链表较长时转为将链表红黑树),未优化以前是o(n),优化后是o(log n)数据结构
jdk没有对它进行任何的同步操做,因此会出现并发访问的问题,甚至会出现死循环致使系统不可用并发
concurrenHashMap(guava中的cache采用的就是这个)优化
原理:concurrenthashmap采用了分段锁技术,其中segment继承于reentrantlock。每当一个线程占用锁访问一个segment时,不会影响到其余的segment线程
1.7采用了分段锁,1.8取消了分段锁,改用CAS + synchronized来保证并发安全性code
1.8以后在数据结构上作了改动,超过阈值后采用红黑树保证了查询效率,甚至取消了reentrantlock(可重入锁),改为synchronized对象