ArrayList和Vector

    今天,因为回顾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 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 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);

	}

}

    在我使用了好几年的笔记本上,多次测试后的统计结果如下:

插入1万条数据时间统计
  时间(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

 

插入10万条数据时间统计
  时间(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

 

插入100万条数据时间统计
  时间(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 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 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);

	}

}

    仍然是在我自己的笔记本上,统计数据如下:

删除1000条数据时间统计
  时间(ms) 平均(ms)
ArrayList 71 76 68 71 76 72.4
Vector 70 78 74 73 70 73

 

删除1万条数据时间统计
  时间(ms) 平均(ms)
ArrayList 455 468 470 468 464 465
Vector 478 464 457 470 468 467.4

 

删除10万条数据时间统计
  时间(ms) 平均(ms)
ArrayList 2175 2181 2149 2130 2161 2159.2
Vector 2152 2209 2202 2148 2182 2178.6

    分析上述的数据,ArrayList和Vector在删除数据方面的性能,似乎也没有太大的差距。而且,不论是ArrayList还是Vector,删除数据要比插入数据慢的多。

 

你可能感兴趣的:(Java基础)