【蓝桥杯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更适合检索和在末尾插入或删除(数组的特性)。


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


相关文章
|
2月前
|
Oracle Java 关系型数据库
掌握Java Stream API:高效集合处理的利器
掌握Java Stream API:高效集合处理的利器
329 80
|
2月前
|
安全 Java API
Java 8 Stream API:高效集合处理的利器
Java 8 Stream API:高效集合处理的利器
221 83
|
2月前
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
125 1
|
2月前
|
存储 缓存 NoSQL
java 集合入门基础理论的核心概念与实用长尾知识
本文介绍了Java集合框架的基础理论知识,包括单列集合(List、Set、Queue)和双列集合(Map)的特点及常用实现类(如ArrayList、HashSet、HashMap等)。详细讲解了集合的遍历方式(迭代器、增强for循环、Lambda表达式)和典型应用场景(如数据去重、键值存储等)。通过具体代码示例,帮助初学者理解集合框架的核心概念和实际应用,为Java编程中的数据存储与管理提供基础指导。
75 0
|
2月前
|
安全 Java API
Java 集合高级应用与实战技巧之高效运用方法及实战案例解析
本课程深入讲解Java集合的高级应用与实战技巧,涵盖Stream API、并行处理、Optional类、现代化Map操作、不可变集合、异步处理及高级排序等核心内容,结合丰富示例,助你掌握Java集合的高效运用,提升代码质量与开发效率。
184 0
|
2月前
|
存储 安全 Java
Java 学习路线 35 掌握 List 集合从入门到精通的 List 集合核心知识
本文详细解析Java中List集合的原理、常用实现类(如ArrayList、LinkedList)、核心方法及遍历方式,并结合数据去重、排序等实际应用场景,帮助开发者掌握List在不同业务场景下的高效使用,提升Java编程能力。
286 0
|
3月前
|
缓存 Java API
Java 集合容器实操技巧与案例详解
本教程基于Java 8+新特性和现代开发实践,深入讲解Java集合容器的实操技巧。通过具体场景演示Stream API数据处理、ConcurrentHashMap并发控制、LinkedHashMap实现LRU缓存、TreeSet自定义排序等高级特性。同时涵盖computeIfAbsent优化操作、EnumMap专用集合使用、集合统计与运算(交集、并集、差集)等内容。代码示例丰富,助力掌握高效编程方法。[点击获取完整代码](https://pan.quark.cn/s/14fcf913bae6)。
55 0
|
2月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
119 0
|
2月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
278 83