Vector的基本介绍:
(1)Vector类的定义说明:我们进入源码界面进行查看:
public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable
(2)Vector底层也是一个对象数组,protected Object[ ]elementData;
数据放在对象数组里面:
(3)Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized(支持线程同步和互斥)我们在源码里面发现它的一个普通的方法也带有synchronized:
(4)在开发中,需要线程同步安全时,考虑使用Vector
单线程用ArrayList,效率比较高。多线程用Vector,效率比较低。
Vector底层结构和ArrayList的比较:
Vector和ArrayList的比较:
底层结构 版本 线程安全(同步)效率 扩容倍数 ArrayList 可变数组 jdk1.2 不安全,效率高 如果有参构造按1.5倍,
如果是无参构造,第一次为10,从第二次开始按1.5倍扩容
Vector 可变数组
Object [ ]
jdk1.0 安全,效率不高 如果是无参,默认为10,如果不够,就按2倍扩容;
如果指定大小,则每次直接按2倍扩
无参构造底层源码分析:
我们设置代码来进行查看:
package com.rgf.list;import java.util.Vector; @SuppressWarnings({"all"}) public class Vector_ {public static void main(String[] args) {//无参构造器Vector vector = new Vector();for (int i = 0; i < 10; i++) {vector.add(i);}vector.add(100);} }
我们进行debug之后:
我们发现继续进行下一步之后如下所示:
我们发现无参构造设置的空间为10.
我们继续进行下一步。
我们先进行自动装箱:
装箱完成之后,我们进入add方法源码界面:添加数据到Vector集合
public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;}
我们发现该方法与ArrayList的方法名称不同,我们进入源码界面进行查看:‘(判断是否需要进行扩容)
我们继续往下走之后我们会发现Vector里面存在数据了。
我们将该数据存储满之后,我们进行对vector.add(100);该行代码进行debug。
我们进入扩容代码如下所示:
如果需要的数组大小不够用,就进行扩容。
private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity); //三元运算符:判断条件?表达式1:表达式2 如果判断条件为真,则返回capacityIncrement,如果判断条件为假,则返回oldCapacity。 capacityIncrement它的值为0,所以相加之后为两倍的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); //三元运算符:判断条件?表达式1:表达式2 如果判断条件为真,则返回capacityIncrement,如果判断条件为假,则返回oldCapacity。 capacityIncrement它的值为0,所以相加之后为两倍的oldCapacity。
有参构造底层源码代码如下所示:
package com.rgf.list;import java.util.Vector; @SuppressWarnings({"all"}) public class Vector_ {public static void main(String[] args) {//无参构造器Vector vector = new Vector();for (int i = 0; i < 10; i++) {vector.add(i);}vector.add(100);//有参构造器Vector vector1 = new Vector(8);for (int i = 0; i < 10; i++) {vector1.add(i);}System.out.println("vector="+vector);} }
我们利用Debug进行逐步运行,如下所示:
我们进入之后,即可看到容量为8,我们再往进即可看到:
之后进入vector.add方法:
之后我们进入ensureCapacityHelper方法进行判断:
而我们再ArrayList里面进行判断的方法为(ensureCapacityInternal):
我们判断不用进行扩容,即返回进去后: 将0值赋值给elementCount数组,同时elementCount进行自增。
之后的扩容与无参数构造的扩容一样。