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

简介: 【蓝桥杯Java_C组·从零开始卷】第八节、集合——list详解(ArrayList、 LinkedList 和 Vector之间的区别)

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);
  // LinkedList add
  startTime = System.nanoTime();
  for (int i = 0; i < 100000; i++) {
    linkedList.add(i,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("--------------------------");
  // 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);
  // 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("--------------------------");
  // 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);
  // 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("--------------------------");
  }
}


效果


image.png


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


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


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


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


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


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


相关文章
|
3月前
|
Java 索引 容器
Java ArrayList扩容的原理
Java 的 `ArrayList` 是基于数组实现的动态集合。初始时,`ArrayList` 底层创建一个空数组 `elementData`,并设置 `size` 为 0。当首次添加元素时,会调用 `grow` 方法将数组扩容至默认容量 10。之后每次添加元素时,如果当前数组已满,则会再次调用 `grow` 方法进行扩容。扩容规则为:首次扩容至 10,后续扩容至原数组长度的 1.5 倍或根据实际需求扩容。例如,当需要一次性添加 100 个元素时,会直接扩容至 110 而不是 15。
Java ArrayList扩容的原理
|
3月前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
4月前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
99 5
|
4月前
|
安全 Java 程序员
Java集合之战:ArrayList vs LinkedList,谁才是你的最佳选择?
本文介绍了 Java 中常用的两个集合类 ArrayList 和 LinkedList,分析了它们的底层实现、特点及适用场景。ArrayList 基于数组,适合频繁查询;LinkedList 基于链表,适合频繁增删。文章还讨论了如何实现线程安全,推荐使用 CopyOnWriteArrayList 来提升性能。希望帮助读者选择合适的数据结构,写出更高效的代码。
176 3
|
3月前
|
NoSQL Java Redis
List集合按照由小到大排序或者由大到小排序
List集合按照由小到大排序或者由大到小排序
62 0
|
9月前
|
存储 安全 Java
java集合框架及其特点(List、Set、Queue、Map)
java集合框架及其特点(List、Set、Queue、Map)
|
6月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
6月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
9月前
|
Java 程序员
Java集合框架:List、Set、Map类型及泛型详解
Java集合框架:List、Set、Map类型及泛型详解
113 0
|
6月前
|
存储 安全 Java
java集合框架复习----(2)List
这篇文章是关于Java集合框架中List集合的详细复习,包括List的特点、常用方法、迭代器的使用,以及ArrayList、Vector和LinkedList三种实现类的比较和泛型在Java中的使用示例。
java集合框架复习----(2)List