经过许久的源码分析,或多或少的发现了Vector和ArrayList的异同
那么我就来分享一下我的研究成果吧!
首先来看看两者之间的区别吧!
--构造函数
/*
* ArrayList三个构造方法
*/
public ArrayList(int initialCapacity); //一个可以设置默认初始容量的类的构造方法
public ArrayList();//一个初始容量为0的类的构造方法
public ArrayList(Collection<? extends E> c);//一个传递参数为集合的类的构造方法
/*
* Vector四个构造方法
*/
public Vector(int initialCapacity, int capacityIncrement);//一个可以设置默认初始容量和增量的类的构造方法
public Vector(int initialCapacity); //一个可以设置默认初始容量的类的构造方法
public Vector();//一个初始容量为10的类的构造方法
public Vector(Collection<? extends E> c);//一个传递参数为集合的类的构造方法
--初始容量和增量的区别
代码验证如下:
package com.zking.list;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
public class Arraylisttest {
// 反射,查看ArrayList属性
static void print(List List) throws Exception {
Class c = List.getClass(); // 得到类的对象
Field f = c.getDeclaredField("elementData"); // 得到属性值
f.setAccessible(true); // 设置为可以访问的属性
Object[] o = (Object[]) f.get(List);
System.out.println(o.length); // 默认长度
}
public static void main(String[] args) throws Exception {
List ls = new ArrayList();
System.out.println("集合中没有任何添加任何对象");
print(ls);
System.out.println("集合中添加到2个对象");
for (int i = 0; i < 2; i++) {
ls.add(i);
}
print(ls);
System.out.println("集合中添加到13个对象");
for (int i = 0; i < 11; i++) {
ls.add(i);
}
print(ls);
System.out.println("集合中添加到20个对象");
for (int i = 0; i < 7; i++) {
ls.add(i);
}
print(ls);
System.out.println("集合中添加到23个对象");
for (int i = 0; i < 3; i++) {
ls.add(i);
}
print(ls);
System.out.println("集合中添加到34个对象");
for (int i = 0; i < 11; i++) {
ls.add(i);
}
print(ls);
System.out.println("集合中添加到50个对象");
for (int i = 0; i < 16; i++) {
ls.add(i);
}
print(ls);
}
}
package com.zking.list;
import java.lang.reflect.Field;
import java.util.Vector;
public class Vectortest {
// 反射,查看Vector属性
static void print(Vector vector) throws Exception {
Class c = vector.getClass(); // 得到类的对象
Field f = c.getDeclaredField("elementData"); // 得到属性值
f.setAccessible(true); // 设置为可以访问的属性
Object[] o = (Object[]) f.get(vector);
System.out.println(o.length); // 默认长度
}
public static void main(String[] args) throws Exception{
/*
* 未设置默认初始容量和默认增量
*/
Vector v=new Vector();
System.out.println("集合中没有任何添加任何对象");
print(v);
System.out.println("集合中添加到11个对象");
for (int i = 0; i < 11; i++) {
v.add(i);
}
print(v);
System.out.println("集合中添加到21个对象");
for (int i = 0; i < 10; i++) {
v.add(i);
}
print(v);
System.out.println("集合中添加到41个对象");
for (int i = 0; i < 20; i++) {
v.add(i);
}
print(v);
System.out.println();
}
}
运行结果如下:
--由此可以得出如下结论:
/*
* Vector的默认初始容量为10,而ArrayList为0
* Vector增量会以2倍增长, ArrayList的增量会以1.5倍增长(第一次增量为0-10中选择最大)
*/
--构造方法上的区别
Vector v=new Vector<>(initialCapacity, capacityIncrement);
List ls=new ArrayList<>(initialCapacity);
--这两者有一个很明显的区别就是,Vector可以设置增量,而List不行
--代码如下:
package com.zking.list;
import java.lang.reflect.Field;
import java.util.Vector;
public class Vectortest {
// 反射,查看vector属性
static void print(Vector vector) throws Exception {
Class c = vector.getClass(); // 得到类的对象
Field f = c.getDeclaredField("elementData"); // 得到属性值
f.setAccessible(true); // 设置为可以访问的属性
Object[] o = (Object[]) f.get(vector);
System.out.println(o.length); // 默认长度
}
public static void main(String[] args) throws Exception{
/*
* 设置默认初始容量和默认增量
*/
System.out.println("设置默认初始容量和默认增量");
Vector v=new Vector(5,2);
System.out.println("Vector集合中没有任何添加任何对象");
print(v);
System.out.println("Vector集合中没有任何添加5个对象");
for (int i = 0; i < 5; i++) {
v.add(i);
}
print(v);
System.out.println("Vector集合中没有任何添加6个对象");
for (int i = 0; i < 1; i++) {
v.add(i);
}
print(v);
System.out.println("Vector集合中没有任何添加8个对象");
for (int i = 0; i < 2; i++) {
v.add(i);
}
print(v);
}
}
--运行结果如下:
--得出结论:Vector可以设置增量并按增量增长,而List不行。
--它们的性能也不同
因为Vector是同步的,是线程安全,会产生等待,同步是一个线程执行完毕后另一个线程再执行,形成一种队列,等待的时间是在于两个线程的完毕和开始的交互产生。
ArrayList是异步的,不需要等待上一个线程执行完后再执行另一个线程
所以Vector的性能要稍次于ArrayList
--下面来看看他们的相同的吧!
1.都采用了可变大小的数组来存储数据(上面的增量可以体现)
2.都可以快速随机的内部元素进行访问。
3.List和Vector都是有序
--代码如下:
package com.zking.list;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
public class Vectortest {
public static void main(String[] args) {
List ls=new ArrayList();
ls.add("a");
ls.add("b");
ls.add("c");
for (Object object : ls) {
System.out.println("List集合"+object);
}
System.out.println();
Vector v=new Vector();
v.add("a");
v.add("b");
v.add("c");
for (Object object :v) {
System.out.println("Vector集合"+object);
}
}
}
--结果如下:
--以下就是我粗略的了解了一下这两者的区别,还有不足的地方请谅解!望大神多多指点