数据结构
文章平均质量分 92
愉悦滴帮主)
凡人之躯,比肩神明
展开
-
HashMap与ConcurrentHashMap面试要点
HashMapHashMap底层数据结构JDK7:数组+链表JDK8:数组+链表+红黑树(看过源码的同学应该知道JDK8中即使用了单向链表,也使用了双向链表,双向链表主要是为了链表操作方便,应该在插入,扩容,链表转红黑树,红黑树转链表的过程中都要操作链表)JDK8中的HashMap为什么要使用红黑树?当元素个数小于一个阈值时,链表整体的插入查询效率要高于红黑树,当元素个数大于此阈值时,链表的整体查询效率要低于红黑树。此阈值在HashMap中为8。JDK8中的HashMap什么时候将链原创 2021-06-03 01:33:23 · 301 阅读 · 0 评论 -
JDK1.8中的ConcurrentHashMap
JDK1.8中的ConcurrentHashMap前言在JDK1.7中的ConcurrentHashMap中我们了解到ConcurrentHashMap采用分段锁的机制,实现并发的更新操作,它首先将数据分成一段一段地存储,然后给每一段数据配一个锁,当一个线程占用锁访问其中一段数据时,其他段的数据也能被其他线程访问,锁分段技术的使用大大了提高并发访问效率。底层由ReentrantLock+Segment+HashEntry组成。然而在jdk1.8中的实现已经抛弃了Segment分段锁机制,利用CAS+原创 2021-05-30 18:46:40 · 1767 阅读 · 1 评论 -
JDK1.8中的HashMap
JDK1.8中的HashMap相比JDK1.7中的HashMap的最大区别就是在JDK1.8中HashMap中的数组加链表结构变为了数组加红黑树。问题1:为什么要将1.7中HashMap的链表结构改为红黑树?在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时也就是链表过长,那么通过key值依次查找的效率较低。而JDK1.8中,HashMap采用位桶+链表+红黑树实原创 2021-05-25 23:29:33 · 1884 阅读 · 0 评论 -
JDK1.7中的ConcurrentHashMap
JDK1.7中的ConcurrentHashMap前言:通过了解HashMap我们知道HashMap时线程不安全的,但是HashTable虽然采用 public synchronized put(key,value)的上锁形式来保证线程安全,显然这样做的效率是非常慢的。假设有两个线程,线程1和线程2,线程1想在table[1]的位置put一个值,线程2想在table[3]的位置同样也put一个值,两个线程同时put显然不会造成脏数据,但是hashTable只能进来一个线程,也就是线程1执行完毕后再去原创 2021-05-23 00:12:47 · 767 阅读 · 0 评论 -
JDK1.7中的HashMap
jdk1.7中的HashMapHashMap:底层是数组加链表ArrayList:底层是数组问题1:为什么HashMap插入时会根据key插入?首先对比ArrayList的新增方法,假设我们新增没有设置索引下标,那么ArrayList进行新增时会默认从0开使依次递增。这样做插入效率是比较高的。那么为什么HashMap没有这样做呢?//add方法 public boolean add(E e) { ensureCapacityInternal(size + 1.原创 2021-05-21 16:39:30 · 605 阅读 · 3 评论