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; }
- 从构造方法中(有参与无参类似):this.elementData = new Object[initialCapacity]; 底层创建的是一个数组结构。
- 无参构造时扩容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); }
- 由int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capacityIncrement : oldCapacity);在无指定的条件下初始容量为10,扩容时扩大一倍,capacityIncrement不指定时默认为0。
- 线程安全:支持线程的同步。
- 查看类中的的方法可知,Vector实现线程的安全同步是在类中的方法使用synchronized同步锁进行修饰。
public synchronized int indexOf(Object o, int index); public synchronized E firstElement(); public synchronized void removeElementAt(int index); ......
- 查看类中的的方法可知,Vector实现线程的安全同步是在类中的方法使用synchronized同步锁进行修饰。
三、API快速使用
- Vector类的使用调用ArrayList的类似,可查看API文档常用方法的使用。
- 排序:sort(),传递的Comparator与Comparable自行查阅(如实现Comparable接口后,重写compareTo()方法)。
-
遍历:
- 使用获取迭代器:it = iterator()方法获取迭代器。
- it.next获取元素。
- 使用增强for循环:for(T parameter,arr)
- 使用获取迭代器:it = iterator()方法获取迭代器。
后期笔记
- Vector类的线程安全性是因为其在add等方法操作时将方法进行同步锁住,即同步方法的形式。
- Stact:Stack是Vector提供的一个子类,用于模拟"栈"这种数据结构(LIFO后进先出)。