最近不知道说点啥,正好最近在研究"HashMap"就来跟大家一起聊一聊吧!!!
HashMap(Jdk1.7)
HashMap在Jdk1.7这个版本并没有什么突出点,底层是由数组+链表来实现的,使用的是Entry节点,插入数据的过程使用的是一个头插法,它可能会导致在扩容时里面有一个Resize,然后又调用了一个Tarnsfer,把里面的一些Entry进行了一个Rehash,这个过程中可能会造成一个链表的循环,在下一次调用Get的时候出现一个死循环的现象,也有可能是他没有加锁,在多个线程并发的情况下不能保证数据是安全的,就是Push进去的值,拿出来不一定还是我们Push的值
HashMap(Jdk1.8)
HashMap在Jdk1.8版本中进行了一个比较大的改变,主要实现就是将原先的数组+链表,变为,数组+链表+红黑树(当链表长度大于8时将会转为红黑树),将原先的Entry节点也变为了Node节点,对他整个的一个Put过程也进行了一个优化(过程就不详细说了,感兴趣的可以去看看https://blog.csdn.net/qq_42254247/article/details/107238893),在1.8版本中将原来的头插法也成功的变成了尾插法
不服没关系咱们继续↓↓↓
不管是Jdk1.7还是Jdk1.8始终线程都是不安全的,其中咱们可以使用ConcurrentHashMap,HashTable线程安全的集合容器,或者加Synchronized,Lock等进行同步操作,不过还是推荐使用ConcurrentHashMap,因为他的并发度是更高的,普通的HashTable是直接在里面的方法进行了一个Synchronized但是ConcurrentHashMap在1.8之后变成了同样的数组+链表+红黑树,他只会锁住当前获取到的那个Entry节点的一个值,在上锁的时候他使用了CAS Synchronized再加上Jdk1.6之后对Synchronized进行了优化所以说他的效率是比较高的