03.Java 集合 - Vector
来源:互联网 发布:node express -e 编辑:程序博客网 时间:2024/05/17 08:47
基本概念
Vector 同 ArrayList 一样,底层数据结构都靠数组来实现。
与 ArrayList 的区别:Vector 的方法都是同步的,即线程安全。由于线程的同步必然要影响性能。因此,ArrayList 的性能比 Vector 好。
原理分析
以下源码均来源自 JDK 1.7。
1.内部构造
- 继承关系,它和 ArrayList 一样都继承自 AbstractList。
- 构造函数,Vector 的内部结构同 ArrayList 一样,都是由数组构成。
不同的是 ArrayList 在构建时只需指定容量大小,而 Vecotor 则需要指定容量大小、容量增加因子两个参数。
// 内部数组protected Object[] elementData;// 容量增加因子protected int capacityIncrement;// 元素个数protected int elementCount;public Vector() { this(10);}public Vector(int initialCapacity) { this(initialCapacity, 0);}public Vector(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0){ // 抛出异常... } this.elementData = new Object[initialCapacity]; this.capacityIncrement = capacityIncrement;}
2.扩容检测
Vector 与 ArrayList 一样,内部都是基于数组来实现的。数组存在着容量固定的缺陷,因此在每次新增操作前,都要进行扩容检测,以保证后续添加进来的元素有存放空间。
public synchronized void ensureCapacity(int minCapacity) { if (minCapacity > 0) { modCount++; ensureCapacityHelper(minCapacity); }}private void ensureCapacityHelper(int minCapacity) { if (minCapacity - elementData.length > 0){ grow(minCapacity); } }private void grow(int minCapacity) { int oldCapacity = elementData.length; // 关键-> 扩充公式:存在增长因子时,新容量 = 旧容量 + 增长因子;否则新容量 = 旧容量*2 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);}private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;private static int hugeCapacity(int minCapacity) { if (minCapacity < 0){ throw new OutOfMemoryError(); } return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;}
整个过程与 ArrayList 大同小异,需要注意的有两个地方:capacityIncrement 、synchronized
capacityIncrement ,增长因子,它决定了 Vector 扩容操作的公式。同样地,这也是与 ArrayList 不同的地方, ArrayList 默认是新容量 = 旧容量*3。
synchronized ,同步标识。在 Vector 中几乎所有的方法都带有该关键字,说明基于 Vector 的操作都是线程安全的,即同一个时刻有且只有一个线程在操作它。正因为如此,也导致了它执行效率不如 ArrayList。
3.其他操作
由于 Vector 的内部结构与 ArrayList 相同,因此增删改查等操作原理也相同,这里不再分析。
唯一不同的是 Vector 的操作都是线程安全的。
0 0
- 03.Java 集合 - Vector
- Java集合之Vector
- java集合------Vector
- Java 集合框架-Vector
- JAVA集合容器--Vector
- java集合--Vector
- Java集合(Vector)
- Java Vector 集合
- Java集合之Vector
- 60、java集合-Vector
- Java集合之Vector
- java--集合--Vector/Stack
- java 集合 vector list ......区别
- java集合类之Vector
- Java笔记集合之Vector
- JAVA学习---集合系列---Vector
- Java集合之Vector、Stack
- Java集合ArrayList,Vector,LinkedList
- 约瑟夫环 Python&Swift实现
- 在你步入职业软件开发生涯那天起就该知道的五件事
- ADB无法找到Android设备
- 友元函数
- MySQL中union操作
- 03.Java 集合 - Vector
- mysql插入数据自增
- Java中的异常处理
- Pixhawk的飞行模式,控制模式解读(原生固件)
- 明天粗分啦!!
- printf关于支持可变参数
- Python网络爬虫(1)
- 数组中制定元素排序
- div背景颜色设置成渐变色