Collection接口框架图

Collection 接口继承图
Collection接口框架图

Set接口
Set集合不允许包含相同的元素,而判断两个对象是否相同则是根据equals方法。

  1. HashSet类
    HashSet类是Set接口的典型实现类。特点:
  • 不能保证元素的排列顺序,加入的元素要特别注意hashCode()方法的实现。
  • HashSet不是同步的,多线程访问同一步HashSet对象时,需要手工同步。
  • 集合元素值可以是null。
  1. LinkedHashSet类
    LinkedHashSet类也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序。与HashSet相比,特点:
  • 对集合迭代时,按增加顺序返回元素。
  • 性能略低于HashSet,因为需要维护元素的插入顺序。但迭代访问元素时会有好性能,因为它采用链表维护内部顺序。
  1. SortedSet接口及TreeSet实现类
    TreeSet类是SortedSet接口的实现类。因为需要排序,所以性能肯定差于HashSet。

List接口
List子接口是有序集合,所以与Set相比,增加了与索引位置相关的操作:

  • add(int index, Object o):在指定位置插入元素
  • addAll(int index, Collection c):…
  • get(int index):取得指定位置元素
  • indexOf(Obejct o):返回对象o在集合中第一次出现的位置
  • lastIndexOf(Object o):…
  • remove(int index):删除并返回指定位置的元素
  • set(int index, Object o):替换指定位置元素
  • subList(int fromIndex, int endIndex):返回子集合

ArrayList和Vector实现类

这两个类都是基于数组实现的List类。
ArrayList是线程不安全的,而Vector是线程安全的。但Vector的性能会比ArrayList低,且考虑到兼容性的原因,有很多重复方法。
Vector提供一个子类Stack,可以挺方便的模拟“栈”这种数据结构(LIFO,后进先出)。
结论:不推荐使用Vector类,即使需要考虑同步,即也可以通过其它方法实现。同样我们也可以通过ArrayDeque类或LinkedList类实现“栈”的相关功能。所以Vector与子类Stack,建议放进历史吧。

LinkedList

LinkedList既是List,也是Queue(Deque),其原因是它是双向的,内部的元素(Entry)同时保留了上一个和下一个元素的引用。使用头部的引用header,取其previous,就可以获得尾部的引用。通过这一转换,可以很容易实现Deque所需要的行为。也正因此,可以支持栈的行为,天生就有push()和pop()方法。简而言之,是Java中的双向链表,其支持的操作和普通的双向链表一样。