【蓝桥杯Java_C组·从零开始卷】第八节、集合——list详解(ArrayList、 LinkedList 和 Vector之

举报
红目香薰 发表于 2022/02/21 11:43:48 2022/02/21
【摘要】 ​ ArrayList、 LinkedList 和 Vector之间的区别ArrayList、 LinkedList 和 Vector都实现了List接口,是List的三种实现,所以在用法上非常相似。他们之间的主要区别体现在不同操作的性能上。后面会详细分析。ArrayListArrayList底层是用数组实现的,可以认为ArrayList是一个可改变大小的数组。随着越来越多的元素被添加到Ar...

 ArrayList、 LinkedList 和 Vector之间的区别

ArrayList、 LinkedList 和 Vector都实现了List接口,是List的三种实现,所以在用法上非常相似。他们之间的主要区别体现在不同操作的性能上。后面会详细分析。

ArrayList

ArrayList底层是用数组实现的,可以认为ArrayList是一个可改变大小的数组。随着越来越多的元素被添加到ArrayList中,其规模是动态增加的。

LinkedList

LinkedList底层是通过双向链表实现的。所以,LinkedList和ArrayList之前的区别主要就是数组和链表的区别。

数组中查询和赋值比较快,因为可以直接通过数组下标访问指定位置。

链表中删除和增加比较快,因为可以直接通过修改链表的指针(Java中并无指针,这里可以简单理解为指针。其实是通过Node节点中的变量指定)进行元素的增删。

所以,LinkedList和ArrayList相比,增删的速度较快。但是查询和修改值的速度较慢。同时,LinkedList还实现了Queue接口,所以他还提供了offer(), peek(), poll()等方法。

Vector

Vector和ArrayList一样,都是通过数组实现的,但是Vector是线程安全的。和ArrayList相比,其中的很多方法都通过同步(synchronized)处理来保证线程安全。

如果你的程序不涉及到线程安全问题,那么使用ArrayList是更好的选择(因为Vector使用synchronized,必然会影响效率)。

二者之间还有一个区别,就是扩容策略不一样。在List被第一次创建的时候,会有一个初始大小,随着不断向List中增加元素,当List认为容量不够的时候就会进行扩容。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。

效率对比试验

package Action;

import java.util.ArrayList;
import java.util.LinkedList;

public class test {
	public static void main(String[] args) {
		ArrayList<Integer> arrayList = new ArrayList<Integer>();
		LinkedList<Integer> linkedList = new LinkedList<Integer>();

		// ArrayList add
		long startTime = System.nanoTime();

		for (int i = 0; i < 100000; i++) {
			arrayList.add(i);
		}
		long endTime = System.nanoTime();
		long duration = endTime - startTime;
		System.out.println("ArrayList add:  " + duration);
		System.gc();
		// LinkedList add
		startTime = System.nanoTime();

		for (int i = 0; i < 100000; i++) {
			linkedList.add(i);
		}
		endTime = System.nanoTime();
		long duration1 = endTime - startTime;
		System.out.println("LinkedList add: " + duration1);
		System.out.println((duration<duration1?"ArrayList add":"LinkedList add")+"更快");
		System.out.println("--------------------------");
		System.gc();
		// ArrayList get
		startTime = System.nanoTime();

		for (int i = 0; i < 10000; i++) {
			arrayList.get(i);
		}
		endTime = System.nanoTime();
		long duration2 = endTime - startTime;
		System.out.println("ArrayList get:  " + duration2);
		System.gc();
		// LinkedList get
		startTime = System.nanoTime();

		for (int i = 0; i < 10000; i++) {
			linkedList.get(i);
		}
		endTime = System.nanoTime();
		long duration3 = endTime - startTime;
		System.out.println("LinkedList get: " + duration3);
		System.out.println((duration2<duration3?"ArrayList get":"LinkedList get")+"更快");
		System.out.println("--------------------------");
		System.gc();
		// ArrayList remove
		startTime = System.nanoTime();

		for (int i = 9999; i >= 0; i--) {
			arrayList.remove(i);
		}
		endTime = System.nanoTime();
		long duration4 = endTime - startTime;
		System.out.println("ArrayList remove:  " + duration4);
		System.gc();
		// LinkedList remove
		startTime = System.nanoTime();

		for (int i = 9999; i >= 0; i--) {
			linkedList.remove(i);
		}
		endTime = System.nanoTime();
		long duration5 = endTime - startTime;
		System.out.println("LinkedList remove: " + duration5);
		System.out.println((duration4<duration5?"ArrayList remove":"LinkedList remove")+"更快");
		System.out.println("--------------------------");
	}
}

效果

添加和删除操作上LinkedList更快,但在查询速度较慢。所以很多时候具体问题具体分析。

但是如果是多线程的时候要选择Vector方便一些同步好处理。

如果不涉及到多线程就从LinkedList、ArrayList两个中选。

LinkedList更适合从中间插入或者删除(链表的特性)

ArrayList更适合检索和在末尾插入或删除(数组的特性)


希望能对大家有一些帮助。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。