集合类基础接口
| 接口 | 描述 |
|---|---|
| Collection | 运行操作一组对象,集合层次结构顶部 |
| Queue | 扩展Collection,只能从列表顶部删除元素 |
| Deque | 扩展Queue以处理双端队列 |
| List | 扩展Collection以处理序列 |
| Set | 集合中的元素必须唯一 |
| SortedSet | 已排序的集合 |
| NavigableSet | 扩展SortedSet以基于最接近匹配原则检索元素 |
JAVA集合实现类
- ArrayList
- LinkedList
- ArrayDeque
- HashSet
- TreeSet
- EnumSet
- LinkedHashSet
- PriorityQueue
Collection重点关注API
- Collection的创建:关注实现类的构造器
- boolean add(E e);此方法的实现决定了此方法的性能
- remove(Object o);
- get(index)
- Iterator<E> iterator();
- contains(Object o);
【知识点】
- Set存储的是不重复的对象,依据hashCode和equals进行判断,所以Set存储的对象必须重写这两个方法;
- 如果自定义对象作为Map的键,那么必须重写hashCode和equals;
- String重写了hashCode和equals方法,所以我们可以非常愉快地使用String对象作为key来使用;
- ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException异常,即java.util.RandomAccessSubListcannotbecasttojava.util.ArrayList;subList返回的是ArrayList的内部类SubList,并不是ArrayList而是ArrayList的一个视图,对于SubList子列表的所有操作最终会反映到原列表上;
- 在subList场景中,高度注意对原集合元素的增加或删除,均会导致子列表的遍历增加、删除产生ConcurrentModificationException异常;
- 使用集合转数组的方法,必须使用集合的toArray(T[]array),传入一样的数组,大小就是list.size();直接使用toArray无参方法存在问题,此方法返回值只能是Object[]类,若强转其它类型数组将出现ClassCastException错误;
- 使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException异常;
总结

List和Set的区别
- List和Set之间很重要的一个区别是是否允许重复元素的存在,在List中允许插入重复的元素,而在Set中不允许重复元素存在,即使插入相同元素也会进行替换;
- List和Set之间另外一个很重要的区别与元素先后存放顺序有关。List是有序集合,而Set是无序集合。List会保留元素插入时的顺序,也就是说之前插入的元素的索引要比之后插入的元素的索引要小。而Set不会保留插入时的顺序;【PS:ArrayList中使用对象数组来存储对象,在每次插入新的对象时会插入到size大小处;至于HashSet,前面说到是通过HashMap来实现的,存入的对象作为HashMap的key,如果key相同会替换value。当然,SortedSet(继承了Set接口)能够以指定的排序方式来保存元素】
- List可以通过下标来访问,而Set不能
【知识点】
- java5.0增加了2种新的容器类型:Queue和BlockingQueue
- java6增加了两种容器类型Deque和BlockingDeque,分别对Queue和BlockingQueue进行了扩展
