集合类基础接口

接口 描述
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的区别

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

【知识点】

  • java5.0增加了2种新的容器类型:Queue和BlockingQueue
  • java6增加了两种容器类型Deque和BlockingDeque,分别对Queue和BlockingQueue进行了扩展

results matching ""

    No results matching ""