00 JDK常见数据结构

数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。

JDK中常使用的数据结构如下:

 

 

 

 

List

ArrayList:基于数组实现,非线程安全,访问速度快,插入和移除性能较差,可以放null元素;

LinkedList:基于链表实现,非线程安全,插入和删除操作更加高效,访问速度较ArrayList慢。

CopyOnWriteArrayList:基于数组实现,每次对该对象操作时,都会复制之前数组创建一个新的数组,性能开销较大。适合使用在读操作远远大于写操作的场景里,比如缓存。

Vector:Vector与ArrayList基本是一致的,不同的是Vector是线程安全的,会在可能出现线程安全的方法前面加上synchronized关键字。随机访问速度快,插入和移除性能较差。该类可以使用Collections.synchronizedList替换掉。

Stack:继承Vector,后进先出,实现了一些栈基本操作的方法,线程安全。

Map

HashMap:非线程安全,读写效率较高。基于数组、链表、红黑树实现,内部维护着一个数组table,该数组保存着每个头结点; 在链表长度大于8的时候,将后面的数据存在红黑树中,以加快检索速度。

 

 

Hashtable:线程安全类,基于数组和链表实现,内部维护着一个数组table,该数组保存着每个链表的头结点。对hashtable操作是用synchronized保障线程安全。

TreeMap:非线程安全,是一个有序Map,会将Key按照自然顺序进行排序或者根据创建映射时提供的Comparator接口进行排序。基于红黑树实现。

LinkedHashMap:非线程安全,继承HashMap,维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。

ConcurrentHashMap:线程安全,基于数组、链表、红黑树的数据结构来实现,并发控制使用Synchronized和CAS,每次操作只锁首节点。

ConcurrentSkipListMap:线程安全, 是一个有序Map,是基于跳表实现的,原理是先大步查找确定范围,再逐渐缩小。并发控制使用CAS

 

 

跳跃表具有以下几个特点:

最底层包含所有节点的一个有序的链表

每一层都是一个有序的链表

每个节点都有两个指针,一个指向右侧节点(没有则为空),一个指向下层节点(没有则为空)

一个头节点指向最高层的第一个节点,通过它可以遍历整张表

WeakHashMap:非线程安全, 基于Entry数组和链表实现,内部是通过弱引用来管理entry的,可以被GC自动回收,适用于缓存的场景。当使用 WeakHashMap 时,即使没有显示的添加或删除任何元素,也可能发生如下情况:

       (1)调用两次size()方法返回不同的值;

       (2)两次调用isEmpty()方法,第一次返回false,第二次返回true;

       (3)两次调用containsKey()方法,第一次返回true,第二次返回false,尽管两次使用的是同一个key;

       (4)两次调用get()方法,第一次返回一个value,第二次返回null,尽管两次使用的是同一个对象。

IdentityHashMap:非线程安全, 基于数组实现,在判断Map中的两个key是否相等时,只通过==来判断,而不通过equals,也就是说,如果两个key相同,那么这两个key必须是同一个对象。key和value的值实际上都是存储在数组中的,而且val是挨着key存储的。

Set

HashSet:基于HashMap实现,值不能重复,无序集合,性能较好,非线程安全;

TreeSet:基于TreeMap实现,值不能重复,按照compareTo方法对对象排序,有序集合,非线程安全;

LinkedHashSet:继承HashSet,基于LinkedHashMap实现,是一个保存了插入顺序的Set,非线程安全;

Queue

ArrayBlockingQueue:线程安全,由数组构成的一个有界队列,按照FIFO(先进先出)原则,不支持扩容,一旦创建,就不能在增加其容量;

LinkedBlockingQueue:线程安全,基于链表实现,如果不指定容量,默认为Integer.MAX_VALUE,也就是无界队列,如果指定容量是个有界队列。按照FIFO(先进先出)原则

PriorityBlockingQueue:线程安全,一个支持线程优先级排序的无界队列,默认自然序进行排序,也可以自定义实现compareTo()方法来指定元素排序规则,不能保证同优先级元素的顺序。。

SynchronousQueue:线程安全,此队列设计的理念类似于"单工模式",对于每个put/offer操作,必须等待一个take/poll操作。

DelayQueue:线程安全,一个实现PriorityBlockingQueue实现延迟获取的无界队列,在创建元素时,可以指定多久才能从队列中获取当前元素。只有延时期满后才能从队列中获取元素。可适用于缓存系统、定时任务调度等

LinkedTransferQueue:线程安全,采用一种预占模式。意思就是消费者线程取元素时,如果队列为空,那就生成一个节点(节点元素为null)入队,然后消费者线程被等待在这个节点上,后面生产者线程入队时发现有一个元素为null的节点,生产者线程就不入队了,直接就将元素填充到该节点,并唤醒该节点等待的线程,被唤醒的消费者线程取走元素,从调用的方法返回。我们称这种节点操作为“匹配”方式。

 

posted @ 2019-04-21 15:05  java小工匠  阅读(911)  评论(0编辑  收藏  举报