Java中的Vector和ArrayList区别及比较
1. Vector和ArrayList的区别
Vector和ArrayList是Java集合框架中两个常用的数组实现类,它们的区别主要有以下几点:
1.1 线程安全
Vector是线程安全的,而ArrayList不是线程安全的。这是由于Vector中的方法都是用synchronized
关键字修饰的,而ArrayList则没有。
1.2 自动增长
Vector和ArrayList都支持自动增长,当元素个数超过当前容量时,它们都会自动调整数组的大小以容纳更多的元素。不同的是,Vector默认情况下会将容量增加一倍,而ArrayList默认情况下只会增加50%。
1.3 初始容量
Vector默认情况下的初始容量是10,而ArrayList是0。
1.4 迭代器实现
从Java 5开始,Vector和ArrayList都支持迭代器(Iterator)遍历元素,但它们的迭代器实现是不同的。Vector的迭代器是同步的(即支持多线程并发访问),而ArrayList的迭代器是非同步的。
2. Vector和ArrayList的比较
虽然Vector和ArrayList之间有一些区别,但它们也有一些相似之处。比如它们的操作效率都为O(1)(如果不考虑数组大小调整的时间),都可以实现快速随机访问,都可以在末尾快速添加或删除元素等等。
下面我们通过两条代码示例来具体说明它们的不同之处:
2.1 线程安全示例
import java.util.ArrayList;
import java.util.List;
public class UnsafeArrayList {
private static List<Integer> list = new ArrayList<>();
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
list.add(i);
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
list.add(i);
}
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(list.size());
}
}
上面的代码用多线程向一个ArrayList中添加10000个元素,由于ArrayList不是线程安全的,所以有可能出现并发问题。结果可能会输出小于20000的数字,因为在多线程执行时,有可能会出现两个线程同时尝试在同一个位置添加元素的情况。
我们可以通过使用 Vector 来解决线程安全问题,把ArrayList 改为Vector:
import java.util.Vector;
public class safeVector {
private static Vector<Integer> list = new Vector<>();
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
list.add(i);
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
list.add(i);
}
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(list.size());
}
}
这里我们使用了Vector代替ArrayList,并且Vector由于是线程安全的,所以不会出现并发问题。结果将会输出20000。
2.2 初始容量示例
import java.util.ArrayList;
import java.util.Vector;
public class InitialCapacity {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
Vector<String> vector = new Vector<>();
System.out.println("ArrayList初始容量:" + arrayList.size());
System.out.println("Vector初始容量:" + vector.size());
}
}
上面的代码分别创建了一个ArrayList和一个Vector对象,并输出它们的初始容量。你会发现在没有添加任何元素之前,ArrayList的初始容量是0,而Vector的初始容量是10。
这是由于ArrayList的初始容量默认为0,而Vector的初始容量默认为10。
所以,当你在开发中需要使用自动增长的数组时,建议你首选ArrayList,这是因为ArrayList比Vector更加高效和易用。而当你需要线程安全时,建议使用Vector。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中的Vector和ArrayList区别及比较 - Python技术站