Vector 底层分析
Vector
是 Java 中的一个线程安全的动态数组实现,也是实现于 List
接口,底层数据结构与 ArrayList
相似,也是一个动态数组存放数据。在 add()
方法的时候使用 synchronized
进行同步写数据,但是开销较大,所以 Vector
是一个同步容器并不是一个并发容器,但在设计上考虑了线程安全性。下面是 Vector
的基本底层分析:
数据结构:
-
Vector
内部同样使用数组来存储元素。 -
初始时,
Vector
的默认容量,当元素数量超过当前容量时,会自动进行扩容操作。与ArrayList
不同的是,Vector
的扩容策略会略有不同。
数组操作:
- 添加、获取、设置和删除元素的操作与
ArrayList
类似,但在实现时考虑了线程安全性。 Vector
在添加、删除、扩容等操作时会使用synchronized
关键字来保证线程安全。
add()
方法:
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
指定位置插入数据:
public void add(int index, E element) {
insertElementAt(element, index);
}
public synchronized void insertElementAt(E obj, int index) {
modCount++;
if (index > elementCount) {
throw new ArrayIndexOutOfBoundsException(index
+ " > " + elementCount);
}
ensureCapacityHelper(elementCount + 1);
System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
elementData[index] = obj;
elementCount++;
}
性能分析:
- 由于
Vector
的方法都是同步的,因此在多线程环境下,可能会导致性能下降。因此,它在单线程环境下的性能可能比ArrayList
差。 - 与
ArrayList
相比,Vector
在添加、删除元素时的性能开销更大,因为它需要在操作时获取锁来保证线程安全性。