ArrayList、LinkedList、Vector之间的区别

 

①ArrayList:内部采用数组存储元素,支持高效随机访问,支持动态调整大小;更适合遍历查询,增删改查的效率相对低;

②LinkedList:内部采用链表来存储元素,支持快速插入/删除元素,但不支持高效地随机访问;更适合增删改,遍历效率相对低[无同步];

③Vector:采用数组存储元素,使用了synchronized方法,是一个线程安全的容器,所以性能上比ArrayList差[同步];

 

 ArrayListLinkedListVector
默认初始容量10 10
扩容机制之前的1.5倍 之前的2倍
底层存储方式数组双向链表数组
线程不安全不安全安全[synchronized方法]
特点查询快,增删慢查询慢,增删改快 

 

 

Collection接口是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(elements);

由Collection接口派生的两个接口是List和Set;

延伸:

面试题:去除[1,100000]之间的偶数

public class testList {
	public static void main(String[] args) {
		//====================去除[1,100000]之间的偶数========================
		arrayRemove();
		arrayAdd();
		linkedremove();
	}
	//准备一个ArrayList
	private static ArrayList<Integer> preList() {
		ArrayList<Integer> arrayList = new ArrayList<Integer>(100001);
		for (int i = 1; i < 100001; i++) {
			arrayList.add(i);
		}
		return arrayList;
	}
	//①ArrayList+迭代器+if+remove
	public static void arrayRemove() {
		ArrayList<Integer> arrayList = preList();
		Long start = System.currentTimeMillis();
		Iterator<Integer> iterator = arrayList.iterator();
		while (iterator.hasNext()) {
			Integer next = iterator.next();
			if (next % 2 == 0) {
				iterator.remove();
			}
		}
		Long end = System.currentTimeMillis();
		System.out.println("普通删除消耗时间:" + (end - start));
	}
	//②ArrayList*2+迭代器+if+add
	public static void arrayAdd() {
		ArrayList<Integer> arrayList1=new ArrayList<Integer>();
        List<Integer> arrayList=preList();
        Long start=System.currentTimeMillis();
        Iterator<Integer> iterator=arrayList.iterator();
        while(iterator.hasNext()){
            Integer i=iterator.next();
            if(i%2!=0){
                arrayList1.add(new Integer(i));
            }
        }
        Long end=System.currentTimeMillis();
        System.out.println("第二种方法时间"+(end-start));
	}
	
	public static void linkedremove(){
        LinkedList<Integer> linkedList=new LinkedList<Integer>();
        for(int i=1;i<100001;i++){
            linkedList.add(new Integer(i));
        }
        Long start=System.currentTimeMillis();
        Iterator<Integer> iterator=linkedList.iterator();
        while(iterator.hasNext()){
            Integer i=iterator.next();
            if(i%2==0){
                iterator.remove();
            }
        }
        Long end=System.currentTimeMillis();
        System.out.println("linked删除消耗时间"+(end-start));
    }
}

普通删除消耗时间:830
第二种方法时间:32
linked删除消耗时间:16

 

检索、插入、删除对象的效率:

ArrayList和Vector中,从指定的位置(用index)检索一个对象,或在集合的末尾插入、删除一个对象的时间是一样的,可表示为O(1)。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行(n-i)个对象的位移操作。
LinkedList中,在插入、删除集合中任何位置的元素所花费的时间都是一样的—O(1),但它在索引一个元素的时候比较慢,为O(i),其中i是索引的位置。

所以,如果只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是对其它指定位置的插入、删除操作,最好选择LinkedList。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渣渣梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值