collection集合接口

Java:集合,Collection接口框架图

Java集合大致可分为Set、List和Map三种体系,其中Set代表无序、不可重复的集合;List代表有序、重复的集合;而Map则代表具有映射关系的集合。Java 5之后,增加了Queue体系集合,代表一种队列集合实现。

Java集合框架主要由Collection和Map两个根接口及其子接口、实现类组成。本文仅探讨Collection接口及其子接口、实现类。

目录

1. Collection接口继承树
2. Collection接口基本操作
3. Collection的遍历
4. Set子接口
  4.1 HashSet类
  4.2 LinkedHashSet类
  4.3 SortedSet接口及TreeSet实现类
  4.4 EnumSet类
5. List子接口
  5.1 ArrayList和Vector实现类
  5.2 LinkedList类
6. Queue子接口
  6.1 PriorityQueue类
  6.2 Deque子接口与ArrayDeque类
  6.3 实现List接口与Deque接口的LinkedList类
7. 各种线性表选择策略

1. Collection接口继承树

collection集合接口_第1张图片

2. Collection接口是Set、List和Queue接口的父接口,基本操作包括:

  • add(Object o):增加元素
  • addAll(Collection c):...
  • clear():...
  • contains(Object o):是否包含指定元素
  • containsAll(Collection c):是否包含集合c中的所有元素
  • iterator():返回Iterator对象,用于遍历集合中的元素
  • remove(Object o):移除元素
  • removeAll(Collection c):相当于减集合c
  • retainAll(Collection c):相当于求与c的交集
  • size():返回元素个数
  • toArray():把集合转换为一个数组

3. Collection的遍历可以使用Iterator接口或者是foreach循环来实现

 参考:Java:集合,数组(Array)、集合(List/Set/Queue)、映射(Map)等的迭代遍历,比如:ArrayList,LinkedList,HashSet,HashMap

4. Set子接口

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

4.1 HashSet类

HashSet类是Set接口的典型实现类。特点:

  1. 不能保证元素的排列顺序,加入的元素要特别注意hashCode()方法的实现。
  2. HashSet不是同步的,多线程访问同一步HashSet对象时,需要手工同步。
  3. 集合元素值可以是null。

4.2 LinkedHashSet类

LinkedHashSet类也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序。与HashSet相比,特点:

  1. 对集合迭代时,按增加顺序返回元素。
  2. 性能略低于HashSet,因为需要维护元素的插入顺序。但迭代访问元素时会有好性能,因为它采用链表维护内部顺序。

4.3 SortedSet接口及TreeSet实现类

TreeSet类是SortedSet接口的实现类。因为需要排序,所以性能肯定差于HashSet。与HashSet相比,额外增加的方法有:

  1. first():返回第一个元素
  2. last():返回最后一个元素
  3. lower(Object o):返回指定元素之前的元素
  4. higher(Obect o):返回指定元素之后的元素
  5. subSet(fromElement, toElement):返回子集合

可以定义比较器(Comparator)来实现自定义的排序。默认自然升序排序。

4.4 EnumSet类

EnumSet类是专为枚举类设计的集合类,EnumSet中的所有元素都必须是指定枚举类型的枚举值。《Effective Java》第32条,用EnumSet代替位域,示范:

复制代码

// EnumSet - a modern replacement for bit fields - Page 160
import java.util.*;

public class Text {
    public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH }

    // Any Set could be passed in, but EnumSet is clearly best
    public void applyStyles(Set