
数据结构
自由圣骑士
喜欢学习、喜欢接近新事物。
展开
-
深入探讨HashMap的底层结构、原理、扩容机制
简介Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示:下面针对各个实现类的特点做一些说明:(1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。...原创 2019-08-07 11:57:37 · 283 阅读 · 0 评论 -
BlockingQueue 阻塞队列
BlockingQueue 通常用于一个线程生产对象,而另外一个线程消费这些对象的场景。下图是对这个原理的阐述:一个线程往里边放,另外一个线程从里边取。一个线程将会持续生产新对象并将其插入到队列之中,直到队列达到它所能容纳的临界点。也就是说,它是有限的。如果该阻塞队列到达了其临界点,负责生产的线程将会在往里边插入新对象时发生阻塞。它会一直处于阻塞之中,直到负责消费的线程从队列中拿走一个对...原创 2019-08-22 20:00:17 · 415 阅读 · 0 评论 -
并发队列之非阻塞队列
与阻塞队列相反,非阻塞队列的执行并不会被阻塞,无论是消费者的出队,还是生产者的入队。在底层,非阻塞队列使用的是 CAS(compare and swap)来实现线程执行的非阻塞。1、非阻塞队列简单操作与阻塞队列相同,非阻塞队列中的常用方法,也是出队和入队。1.1、入队方法:add():底层调用 offer();offer():Queue 接口继承下来的方法,实现队列的入队操作,不会阻碍线...原创 2019-08-23 15:59:34 · 530 阅读 · 0 评论 -
使用java的集合时,需要注意的问题
1、ArrayList 踩坑首先大家看看这段代码有什么问题嘛?其实在大部分情况下这都是没啥问题,无非就是循环的往 ArrayList 中写入数据而已。但在特殊情况下,比如这里的 getData() 返回数据非常巨大时后续 temp.add(str) 就会有问题了。比如我们在 review 代码时发现这里返回的数据有时会高达 2000W,这时 ArrayList 写入的问题就凸显出来了。...原创 2019-09-02 10:54:08 · 342 阅读 · 0 评论 -
为什么ConcurrentHashMap的get操作不需要加锁?
我们知道,ConcurrentHashmap(1.8)这个并发集合框架是线程安全的,当你看到源码的get操作时,会发现get操作全程是没有加任何锁的这也是这篇博文讨论的问题——为什么它不需要加锁呢?1、ConcurrentHashMap的简介有基础的同学知道在jdk1.7中是采用Segment + HashEntry + ReentrantLock的方式进行实现的1.8中放弃了Segmen...原创 2019-09-07 11:50:38 · 6778 阅读 · 3 评论 -
由 HashMap 引发的一个面试10连炮!
1、面试场景HashMap 是不是有序的?你回答不是有序的。那面试官就会可能继续问你,有没有有序的Map实现类呢?你如果这个时候说不知道的话,那这块问题就到此结束了。如果你说有TreeMap和LinkedHashMap。那么面试官接下来就可能会问你,TreeMap和LinkedHashMap是如何保证它的顺序的?如果你回答不上来,那么到此为止。如果你说TreeMap是通过实现SortM...原创 2019-09-18 16:00:45 · 145 阅读 · 0 评论