Java Collections

Java集合类如图所示

Java Collections


1. Iterator

迭代器接口,是一种设计模式,用来遍历序列对象。

1.1 ListIterotr

可双向遍历。


2. Collection

  • 最基本的集合接口,继承于Iterator,自身不被直接继承,两个子接口List和Set



2.1 List

  • 有序Collection
  • 提供基于索引的随机访问,内容可重复。
  • 实现了ListIterator接口,可向前遍历


2.1.1 ArrayList

  • 可变数组,允许随机访问
  • 允许含null,只能存对象
  • 非同步,线程不安全
  • 有容量Capacity,每次扩充原来的一半。创建ArrayList时最好指定Capacity,提高插入效率。存在空间浪费。

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }


2.1.2 LinkedList

  • 可变链表,允许随机访问
  • 允许含null
  • 可双向遍历,头尾操作快,可以用作Stack、Queue、双向Queue
  • 非同步,线程不安全
  • 比ArrayList更占空间,每个节点存储两个引用,分别指向前后元素


2.1.3 Vector

  • 与ArrayList类似。
  • Vector很多方法由synchronized修饰,是同步的,线程安全。

    • 如果遍历Vector过程中,另一个线程改变了Vector,则会报错。
  • 扩充容量为原来的一倍,并且可以自己设置扩充因子

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }


2.1.4 Stack

  • 继承于Vector,Vector的堆栈实现,包括empty、peek、pop、push、search等方法。


2.2 Set

  • 成员不可重复
  • 可以有序


2.2.1 HashSet

  • 基于HashMap,key存值,value存系统默认的Object对象,可快速查找
  • 不保证有序,非同步
  • 成员为Object子类对象
  • 可以放一个null


2.2.2 TreeSet

  • 基于TreeMap,默认有序
  • 自定义对象要实现Comparable接口才能放入TreeSet


2.2.3 LinkedHashSet

  • 在HashSet基础上,维护一个链表来记录插入顺序。这使得它访问顺序比HashSet好,但插入顺序相比稍差。


3. Map

键值对,键不能重复,快速查找


3.1 HashMap

  • 可含有一个key为null的键值对
  • 非同步,若让HashMap同步,使用Collections.synchorniezMap(),
  • 去除了contains方法
  • 扩容为2的幂


3.2 TreeMap

  • 基于红黑树,有序
  • 遍历value时尽量使用entrySet遍历,这样防止二次查找(keySet找value极慢)
  • 可以返回一个子树


3.3 LinkedHashMap

  • HashMap子类,于LinkedHashSet类似,额外添加双向链表来保证顺序
上一篇:Closeable


下一篇:Mac同时安装Java1.7和Java1.8