相同
这两个类都实现了List接口。
他们都是有序集合。
不同
ArrayList实现不是同步的,Vector实现是同步的。
ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。
下面两段代码主要演示了线程同步的区别:
ArrayList:
import java.util.ArrayList; /** * * @author InJavaWeTrust * */ public class ArrayListMultiThread implements Runnable { public static ArrayList<Integer> li = new ArrayList<Integer>(); public void run() { for (int i = 0; i < 100000; i++) { li.add(i); } } public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new ArrayListMultiThread()); Thread t2 = new Thread(new ArrayListMultiThread()); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(li.size()); } }
运行结果:
这是因为ArrayList在扩展过程中,内部一致性遭到破坏,由于不是同步的,另外一个线程访问到了不一致的内部状态,导致出现越界问题。
Vector:
import java.util.Vector; /** * * @author InJavaWeTrust * */ public class VectorMultiThread implements Runnable { public static Vector<Integer> v = new Vector<Integer>(); public void run(){ for (int i = 0; i < 100000; i++) { v.add(i); } } public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new VectorMultiThread()); Thread t2 = new Thread(new VectorMultiThread()); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(v.size()); } }
运行结果: