![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
Kincym
这个作者很懒,什么都没留下…
展开
-
八大排序之--冒泡排序
原理冒:原创 2017-05-18 16:42:04 · 582 阅读 · 0 评论 -
Java并发容器——ConcurrentLinkedQueue
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。 JDK中,提供了一个ConcurrentLinkedQueue类来原创 2017-12-25 16:27:43 · 291 阅读 · 0 评论 -
Java并发容器——ConcurrentSkipListMap
当我们希望快速存取<Key, Value>键值对时我们可以使用HashMap。当我们希望在多线程并发存取<Key, Value>键值对时,我们会选择ConcurrentHashMap。TreeMap则会帮助我们保证数据是按照Key的自然顺序或者compareTo方法指定的排序规则进行排序。OK,那么当我们需要多线程并发存取<Key, Value>数据并且希望保证数据有序时,我们需要怎么做呢?原创 2017-12-25 11:57:23 · 572 阅读 · 0 评论 -
Java并发容器——ConcurrentHashMap
并发环境下为什么使用ConcurrentHashMapHashMap在高并发的环境下,执行put操作会导致HashMap的Entry链表形成环形数据结构,从而导致Entry的next节点始终不为空,因此产生死循环获取EntryHashTable虽然是线程安全的,但是效率低下,当一个线程访问HashTable的同步方法时,其他线程如果也访问HashTable的同步方法,那么会进入阻塞或者轮训状态。原创 2017-12-22 10:51:03 · 266 阅读 · 0 评论 -
阻塞queue系列之SynchronousQueue
SynchronousQueue是这样一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。 常用方法add @Test public void addAndtake() throws InterruptedException {// Executors.newCachedThreadPool().原创 2017-12-21 16:35:29 · 458 阅读 · 0 评论 -
阻塞queue系列之LinkedTransferQueue
LinkedTransferQueue在JDK7 中新增的。无界FIFO线程安全的阻塞队列。 transfer 算法比较复杂,实现很难看明白。大致的理解是采用所谓双重数据结构 (dual data structures) 。之所以叫双重,其原因是方法都是通过两个步骤完成:保留与完成。比如消费者线程从一个队列中取元素,发现队列为空,他就生成一个空元素放入队列 , 所谓空元素就是数据项字段为空。然后原创 2017-12-21 16:03:28 · 681 阅读 · 0 评论 -
阻塞queue系列之DelayQueue
DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的Delayed 元素。底层也是通过数组实现,所以读写操作使用的是同一把锁,其插入的元素必须实现Delayed接口。构造方法public DelayQueue() {}public DelayQueue(Collection<? extends E> c) { this.ad原创 2017-12-21 10:48:58 · 620 阅读 · 0 评论 -
阻塞queue系列之PriorityBlockingQueue
和ArrayBlockingQueue一样内部使用数组实现,插入和获取数据使用同一把锁。不同的是,不管有无指定长度,都会实现可以实现自动扩容;在构造函数需传入comparator,用于插入元素时继续排序,若没有传入comparator,则插入的元素必须实现Comparatable接口。构造函数 public PriorityBlockingQueue() { this(DEFAULT原创 2017-12-21 00:56:52 · 5513 阅读 · 2 评论 -
阻塞queue系列之LinkedBlockingQueue
LinkedBlockingQueue继承AbstractQueue,实现了BlockingQueue,Serializable接口。内部使用单向链表存储数据。可定义容量,默认初始化容量是Integer最大值(可能出现内存溢出)。插入和取出使用不同的锁,putLock插入锁,takeLock取出锁,添加和删除数据的时候可以并行。多CPU情况下可以同一时刻既消费又生产。LinkedBlockingQu原创 2017-12-21 00:13:51 · 728 阅读 · 0 评论 -
阻塞queue系列之LinkedBlockingDeque
LinkedBlockingDeque是一个基于链表的双端阻塞队列。 LinkedBlockingDeque使用的是一把锁。 其它基本和LinkedBlockingQueue无异,前往LinkedBlockingQueue原创 2017-12-21 00:26:16 · 358 阅读 · 0 评论 -
阻塞queue系列之ArrayBlockingQueue
extends AbstractQueueimplements BlockingQueue, java.io.Serializable一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。添加和删除使用的是同一把锁Reentr...原创 2017-12-20 23:07:34 · 817 阅读 · 0 评论 -
八大排序之--直接插入排序
## 基本思想 ## 直接插入排序的基本操作是将一个记录插入到已经排好的有序表中,从而得到一个新的、记录数增1的有序表。对于给定的一组记录,初始时假定第一个记录自成一个有序序列,其余记录为无序序列。接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的有序序列中,直到最后一个记录插到有序序列中为止。 复杂度分析当最好的情况,也就是要排序的表本身就是有序的,此时只有数据比较,没有原创 2017-05-19 23:03:17 · 486 阅读 · 0 评论 -
八大排序之--快速排序
基本思想快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动次数。同时采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的,其原理如下:对于给定的一组记录,选择一个基准原创 2017-05-19 22:08:16 · 317 阅读 · 0 评论 -
Java并发容器——CopyOnWriteArrayList
CopyOnWriteArrayList这是一个ArrayList的线程安全的变体,其原理大概可以通俗的理解为:初始化的时候只有一个容器,很常一段时间,这个容器数据、数量等没有发生变化的时候,大家(多个线程),都是读取(假设这段时间里只发生读取的操作)同一个容器中的数据,所以这样大家读到的数据都是唯一、一致、安全的,但是后来有人往里面增加了一个数据,这个时候CopyOnWriteArrayList原创 2017-12-25 16:44:31 · 316 阅读 · 0 评论