一、定义
集合是用来存储数据的容器。Java中的集合接口有两大类:Collection接口和Map接口。 Collection接口下面有List接口和Set接口;其中,List接口的主要实现类是ArrayList、LinkedList、Stack、Queue等;Set接口的主要实现类是HashSet等。 Map接口的主要实现类有:HashMap、Hashtable、CocurrentHashMap等;
二、常见集合
1、List
2、Set
HashSet是一个由HashMap实现的集合,元素无序且不能重复。若需要按插入顺序排序,可以使用LinkedHashSet。若需要按自定义规则排序,可以使用TreeSet,底层是通过TreeMap实现。HashSet是线程不安全的,若要使用线程安全的Set集合,可以采用Collections.synchronizedSet()构造一个线程安全的Set,CopyOnWriteArraySet。 HashSet底层原理是基于HashMap实现的,相关HashSet操作,基本上都是直接调用HashMap的相关方法来完成。
3、Queue
BlockingQueue是Queue接口的子接口。它支持阻塞的插入和移除元素。下面是它支持的方法:
插入:
a、add:插入过程出错会抛出异常
b、put:当队列满的时,队列会阻塞插入元素的线程,直到队列没有塞满可以插入元素为止
c、offer:在put的基础上加了超时机制
移除:
a、remove:删除过程出错会抛出异常
b、take:当队列尾空时,队列会阻塞获取元素的线程,直到队列变为非空可以获取元素为止。
c、poll:在take的基础上加了超时机制
查看:
a、element
b、peek
4、Map
三、并发集合
1、定义
2、种类
(1)CopyOnWriteArrayList
(2)CocurrentHashMap
四、List、Set、Map的区别
- 数据结构
- 元素是否有序
- 元素是否可重复
- 键值是否为null HashMap允许key和value为null;HashTable不允许key和value为null;TreeMap不允许key为null,但是value可以为null;
五、常见问题
1、循环删除List元素可能发生的异常
- IndexOutOfBoundsException:下标越界异常;
- ConcurrentModificationException:迭代器遍历fail-fast集合时,会由于对集合进行修改或者删除操作引发并发修改异常
2、fail-fast和fail-safe的区别
- fail-fast和fail-safe是集合中的一种错误处理机制。
- fail-fast是快速失败机制,当集合利用迭代器进行遍历时,出现结构变更,会抛出CocurrentModificationException。java.util包中的所有集合都被设计为fail-fast机制的,比如ArrayList、HashMap等。
- fail-safe是安全失败机制,遍历过程中结构发生变更是安全的,不会抛出ConcurrentModificationException。juc包中的并发集合都被设计为fail-safe机制,比如CopyOnWriteArrayList、ConcurrentHashMap等。