深入理解之源码剖析Vector

Vector类

一、概述

Vector与ArrayList一样,也是通过数组实现的,与ArrayList的操作访问类似,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。所以现在已经不太常用了。

  • Vector知识点
    • 数据结构:底层通过数组实现。
    • 无参构造时初始容量为10,扩容时扩大1倍,有指定扩容值时按造指定值扩容。
    • 线程安全:支持线程的同步。
  • 为什么大多使用ArrayList代替Vector
    • Vector所有方法都是同步,有性能损失。
    • Vector初始length是10 超过length时 以100%比率增长,相比于ArrayList更多消耗内存。

二、源码剖析Vector

  • 数据结构:底层通过数组实现。
    • 从构造方法中(有参与无参类似):this.elementData = new Object[initialCapacity]; 底层创建的是一个数组结构。
      public Vector(int initialCapacity, int capacityIncrement) {
          super();
          if (initialCapacity < 0)
              throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
          this.elementData = new Object[initialCapacity];
          this.capacityIncrement = capacityIncrement;
      }
      
  • 无参构造时扩容1倍,有指定扩容值时按造指定值扩容。
    • 由int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);在无指定的条件下初始容量为10,扩容时扩大一倍,capacityIncrement不指定时默认为0。
      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);
      }
      
  • 线程安全:支持线程的同步。
    • 查看类中的的方法可知,Vector实现线程的安全同步是在类中的方法使用synchronized同步锁进行修饰。
      public synchronized int indexOf(Object o, int index);
      public synchronized E firstElement();
      public synchronized void removeElementAt(int index);
      ......
      

三、API快速使用

  • Vector类的使用调用ArrayList的类似,可查看API文档常用方法的使用。
  • 排序:sort(),传递的Comparator与Comparable自行查阅(如实现Comparable接口后,重写compareTo()方法)。
  • 遍历
    • 使用获取迭代器:it = iterator()方法获取迭代器。
      • it.next获取元素。
    • 使用增强for循环:for(T parameter,arr)

后期笔记

  • Vector类的线程安全性是因为其在add等方法操作时将方法进行同步锁住,即同步方法的形式。
  • Stact:Stack是Vector提供的一个子类,用于模拟"栈"这种数据结构(LIFO后进先出)。

流程图

上一篇:Stack的底层Vector源码浅析


下一篇:Arraylist源码分析: