阅读534 返回首页    go 阿里云 go 技术社区[云栖]


Java Collections

Java集合类如图所示

gather


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类似,额外添加双向链表来保证顺序

最后更新:2017-09-07 10:02:56

  上一篇:go  阿里云免费企业邮箱申请流程
  下一篇:go  人工智能时代的产品思维(2C)