Vector和ArrayList异同

经过许久的源码分析,或多或少的发现了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);
		}
	}
	
	
}

--结果如下:




--以下就是我粗略的了解了一下这两者的区别,还有不足的地方请谅解!望大神多多指点

展开阅读全文

没有更多推荐了,返回首页