今天,因为回顾Java基础知识,写了上一篇博客,最后写到了HashMap,然后联想到Java常用的数据结构。所以,首先查找了一些关于ArrayList和Vector的一些资料,并查看了部分源码。接下来,写一下对ArrayList和Vector的一些理解。
ArrayList和Vector的使用非常的相似,都可用来表示一种数量可变的对象的集合。通过看Vector的源码可以看到,Vector的很多方法都是使用synchronized修饰的,也就是说,这些方法都是同步的,是线程安全的。下面是Vector部分源码,跟add操作相关的代码(确实是有同步操作):
public void add(int index, E element) {
insertElementAt(element, index);
}
public synchronized void insertElementAt(E obj, int index) {
modCount++;
if (index > elementCount) {
throw new ArrayIndexOutOfBoundsException(index
+ " > " + elementCount);
}
ensureCapacityHelper(elementCount + 1);
System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);
elementData[index] = obj;
elementCount++;
}
我们都知道,同步方法会带来额外的开销。因此,理论上来讲,如果对线程安全要求不高,使用ArrayList比使用Vector效率更高。但是,这个效率的差别很大吗?接下来,我们就探讨一下Vector和ArrayList在一些操作上效率的不同。
一、插入数据的效率
我们分别往Vector和ArrayList中插入1万,10万和100万条相同的数据,看一下二者的效率差别有多大。如下是测试代码:
import java.util.Vector;
public class VectorDemo {
public static void main(String[] args) {
Vector<String> vector = new Vector<>();
Long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
vector.add("data" + i);
}
Long end = System.currentTimeMillis();
Long time = end - start;
System.out.println("time:"+time);
}
}
import java.util.ArrayList;
import java.util.List;
public class ArrayListDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
Long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
list.add("data" + i);
}
Long end = System.currentTimeMillis();
Long time = end - start;
System.out.println("time:"+time);
}
}
在我使用了好几年的笔记本上,多次测试后的统计结果如下:
时间(ms) | 平均(ms) | ||||||||||
ArrayList | 6 | 5 | 6 | 6 | 7 | 4 | 7 | 6 | 6 | 6 | 5.9 |
Vector | 5 | 7 | 4 | 6 | 5 | 6 | 6 | 6 | 6 | 6 | 5.7 |
时间(ms) | 平均(ms) | ||||||||||
ArrayList | 34 | 37 | 37 | 31 | 34 | 33 | 30 | 33 | 31 | 32 | 33.2 |
Vector | 34 | 35 | 34 | 37 | 35 | 33 | 32 | 36 | 36 | 32 | 34.4 |
时间(ms) | 平均(ms) | ||||||||||
ArrayList | 637 | 657 | 634 | 652 | 668 | 672 | 653 | 631 | 642 | 651 | 649.7 |
Vector | 688 | 659 | 666 | 662 | 644 | 688 | 636 | 662 | 668 | 674 | 662.7 |
插入1000万条数据的测试,我也做了几次,ArrayList和Vector都在10000毫秒左右。由上面的统计结果看,Vector和ArrayList在插入数据方面的性能差距不大,可以说是几乎没有差别!
二、删除数据的效率
我们分别从Vector和ArrayList中插入20万条数据,并删除1000、1万、10万条数据,比较一下删除数据的效率,我用的测试代码如下:
import java.util.Vector;
public class VectorDemo {
public static void main(String[] args) {
Vector<String> vector = new Vector<>();
for (int i = 0; i < 200000; i++) {
vector.add("data" + i);
}
Long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
vector.remove(i);
}
Long end = System.currentTimeMillis();
Long time = end - start;
System.out.println("time:" + time);
}
}
import java.util.ArrayList;
import java.util.List;
public class ArrayListDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
for (int i = 0; i < 200000; i++) {
list.add("data" + i);
}
Long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
list.remove(i);
}
Long end = System.currentTimeMillis();
Long time = end - start;
System.out.println("time:" + time);
}
}
仍然是在我自己的笔记本上,统计数据如下:
时间(ms) | 平均(ms) | |||||
ArrayList | 71 | 76 | 68 | 71 | 76 | 72.4 |
Vector | 70 | 78 | 74 | 73 | 70 | 73 |
时间(ms) | 平均(ms) | |||||
ArrayList | 455 | 468 | 470 | 468 | 464 | 465 |
Vector | 478 | 464 | 457 | 470 | 468 | 467.4 |
时间(ms) | 平均(ms) | |||||
ArrayList | 2175 | 2181 | 2149 | 2130 | 2161 | 2159.2 |
Vector | 2152 | 2209 | 2202 | 2148 | 2182 | 2178.6 |
分析上述的数据,ArrayList和Vector在删除数据方面的性能,似乎也没有太大的差距。而且,不论是ArrayList还是Vector,删除数据要比插入数据慢的多。