集合的总结
一、接口继承关系
Collection:Collection 是集合 List、Set、Queue 的最基本的接口。
Map:是映射表的基础接口;
二、Collecion
Collection 是集合 List、Set、Queue 的最基本的接口。
1、List
- ArrayList:
- 底层使用数组实现;
- 线程不安全;
- 查询快,增删慢;
- 当容量不够,扩容为原来的 1.5 倍;
- Vector:
- 底层使用数组实现;
- 线程安全;
- 查询快,增删慢;
- 当容量不够,扩容为原来的 2 倍;
- LinkedList:
- 底层使用双向链表的数据结构实现;
- 线程不安全;
- 查询慢,增删快;
2、Set
- HashSet:
- 底层使用 hash表实现;
- 排列无序,不可重复;
- TreeSet:
- 底层使用 二叉树 实现;排序存储;
- 排列无序,不可重复;
- LinkedSet:
- 底层使用 hash表存储,并用双向链表记录插入的顺序;
- 实现;排列有序,不可重复;
3、Queue
(1)队列的主要操作方法:
<1> 插入:
- public abstract boolean add(E paramE):将指定元素插入此队列中(如果立即可行且不会违反容量限制),成功时返回true,如果当前没有可用的空间,则抛出 IllegalStateException。如果该元素是 NULL,则会抛出 NullPointerException 异常。
- public abstract boolean offer(E paramE):将指定元素插入此队列中(如果立即可行且不会违反容量限制),成功时返回 true,如果当前没有可用的空间,则返回 false。
- public abstract void put(E paramE) throws InterruptedException: 将指定元素插入此队列中,将等待可用的空间(如果有必要);
- offer(E o, long timeout, TimeUnit unit):可以设定等待的时间,如果在指定的时间内,还不能往队列中加入 BlockingQueue,则返回失败。
<2> 获取:
- poll(time):取走 BlockingQueue 里排在首位的对象,若不能立即取出,则可以等 time 参数规定的时间,再取不到时返回 null;
- poll(long timeout, TimeUnit unit):从 BlockingQueue 取出一个队首的对象,如果在指定时间内,队列一旦有数据可取,则立即返回队列中的数据。否则直到时间超时还没有数据可取,返回失败。
- take():取走 BlockingQueue 里排在首位的对象,若 BlockingQueue 为空,则阻断进入等待状态直到 BlockingQueue 有新的数据被加入。
- drainTo():一次性从 BlockingQueue 获取所有可用的数据对象(还可以指定获取数据的个数),通过该方法,可以提升获取数据效率;不需要多次分批加锁或释放锁。
(2)常用的阻塞队列
- ArrayBlockingQueue:
- 用数组实现的有界阻塞队列;
- 默认情况下,不保证访问者公平的访问队列;
- LinkedBlockingQueue:
- 基于链表的阻塞队列;
- 能够高效的处理并发数据,因为其对于生产者端和消费者端分别采用了独立的锁来控制数据同步,意味着在高并发的情况下生产者和消费者可以并行地操作队列中的数据,以此来提高整个队列的并发性能;
- 默认一个类似无限大小的容量(Integer.MAX_VALUE);
- PriorityBlockingQueue:
- 支持优先级的无界队列 ;
- 默认情况下元素采取自然顺序升序排列;
- 可以自定义实现 compareTo()方法来指定元素进行排序规则;
- DelayQueue:
- 支持延时获取元素的无界阻塞队列;
- SynchronousQueue:
- 是一个不存储元素的阻塞队列;
- 每一个 put 操作必须等待一个 take 操作,否则不能继续添加元素。
- SynchronousQueue 的 吞 吐 量 高 于 LinkedBlockingQueue 和 ArrayBlockingQueue。
- 是一个不存储元素的阻塞队列;
三、Map
1、HashMap(数组+链表+红黑树)
- 最多只允许一条记录的键为 null;
- 当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍;
2、HashTable
- key 和 value 都不允许为 null;
- 任一时间只有一个线程能写 Hashtable,并发性不如 ConcurrentHashMap;
3、TreeMap
- TreeMap 实现 SortedMap 接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器;
- 在使用 TreeMap 时,key 必须实现 Comparable 接口或者在构造 TreeMap 传入自定义的 Comparator,否则会在运行时抛出 java.lang.ClassCastException 类型的异常。
4、LinkedHashMap
LinkedHashMap 是 HashMap 的一个子类,保存了记录的插入顺序,在用 Iterator 遍历LinkedHashMap 时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。
5、ConcurrentHashMap