Java中List集合的介绍

article/2025/11/7 23:49:31

List 是什么
JavaList集合是指由JavaList接口以及List接口的所有实现类组成的集合。
List集合中的元素允许重复,各元素的顺序放是对象插入的顺序.类似Java中的数组,用户可通过使用索引(元素在集合中的位置)来访问集合中的元素.

1.Java集合介绍

Java集合就像一个容器,可以存储任何类型的数据,也可以结合泛型来存储具体的类型对象。在程序运行时,Java集合可以动态的进行扩展,随着元素的增加而扩大。在Java中,集合类通常存在于java.util包中。

Java集合主要由2大体系构成,分别是Collection体系和Map体系,其中Collection和Map分别是2大体系中的顶层接口。

Collection主要有三个子接口,分别为List(列表)、Set(集)、Queue(队列)。其中,List、Queue中的元素有序可重复,而Set中的元素无序不可重复。

List中主要有ArrayList、LinkedList两个实现类;Set中则是有HashSet实现类;而Queue是在JDK1.5后才出现的新集合,主要以数组和链表两种形式存在。

Map同属于java.util包中,是集合的一部分,但与Collection是相互独立的,没有任何关系。Map中都是以key-value的形式存在,其中key必须唯一,主要有HashMap、HashTable、treeMap三个实现类。
在这里插入图片描述

2.List介绍

Collection中,List集合是有序的,可对其中每个元素的插入位置进行精确地控制,可以通过索引来访问元素,遍历元素。

在List集合中,我们常用到ArrayListLinkedList这两个类

2.1 ArrayList集合

  1. ArrayList底层通过数组实现,随着元素的增加而动态扩容。
  2. ArrayList是Java集合框架中使用最多的一个类,是一个数组队列,线程不安全集合。
    它继承于AbstractList,实现了List, RandomAccess, Cloneable, Serializable接口。
  3. ArrayList实现List,得到了List集合框架基础功能;
  4. ArrayList实现RandomAccess,获得了快速随机访问存储元素的功能,RandomAccess是一个标记接口,没有任何方法;
  5. ArrayList实现Cloneable,得到了clone()方法,可以实现克隆功能;
  6. ArrayList实现Serializable,表示可以被序列化,通过序列化去传输,典型的应用就是hessian协议。

ArrayList集合的特点:

  • 容量不固定,随着容量的增加而动态扩容(阈值基本不会达到)
  • 有序集合(插入的顺序==输出的顺序)
  • 插入的元素可以为null
  • 增删改查效率更高(相对于LinkedList来说)
  • 线程不安全

ArrayList的底层数据结构:
ArrayList的底层数据结构

2.2 LinkedList集合

  1. LinkedList底层通过链表来实现,随着元素的增加不断向链表的后端增加节点。
  2. LinkedList是一个双向链表,每一个节点都拥有指向前后节点的引用。相比于ArrayList来说,LinkedList的随机访问效率更低。
    它继承AbstractSequentialList,实现了List, Deque, Cloneable, Serializable接口。
  3. LinkedList实现List,得到了List集合框架基础功能;
  4. LinkedList实现Deque,Deque 是一个双向队列,也就是既可以先入先出,又可以先入后出,说简单点就是既可以在头部添加元素,也可以在尾部添加元素;
  5. LinkedList实现Cloneable,得到了clone()方法,可以实现克隆功能;
  6. LinkedList实现Serializable,表示可以被序列化,通过序列化去传输,典型的应用就是hessian协议。

LinkedList集合的底层数据结构:

LinkedList集合的底层数据结构

3.List常用方法

A:添加功能
boolean add(E e):向集合中添加一个元素
void add(int index, E element):在指定位置添加元素
boolean addAll(Collection<? extends E> c):向集合中添加一个集合的元素。B:删除功能
void clear():删除集合中的所有元素
E remove(int index):根据指定索引删除元素,并把删除的元素返回
boolean remove(Object o):从集合中删除指定的元素
boolean removeAll(Collection<?> c):从集合中删除一个指定的集合元素。C:修改功能
E set(int index, E element):把指定索引位置的元素修改为指定的值,返回修改前的值。D:获取功能
E get(int index):获取指定位置的元素
Iterator iterator():就是用来获取集合中每一个元素。E:判断功能
boolean isEmpty():判断集合是否为空。
boolean contains(Object o):判断集合中是否存在指定的元素。
boolean containsAll(Collection<?> c):判断集合中是否存在指定的一个集合中的元素。F:长度功能
int size():获取集合中的元素个数G:把集合转换成数组
Object[] toArray():把集合变成数组。

3.1 ArrayList 基本操作

public class ArrayListTest {public static void main(String[] agrs){//创建ArrayList集合:List<String> list = new ArrayList<String>();System.out.println("ArrayList集合初始化容量:"+list.size());// ArrayList集合初始化容量:0//添加功能:list.add("Hello");list.add("world");list.add(2,"!");System.out.println("ArrayList当前容量:"+list.size());// ArrayList当前容量:3//修改功能:list.set(0,"my");list.set(1,"name");System.out.println("ArrayList当前内容:"+list.toString());// ArrayList当前内容:[my, name, !]//获取功能:String element = list.get(0);System.out.println(element);// my//迭代器遍历集合:(ArrayList实际的跌倒器是Itr对象)Iterator<String> iterator =  list.iterator();while(iterator.hasNext()){String next = iterator.next();System.out.println(next);}/**  myname!*///for循环迭代集合:for(String str:list){System.out.println(str);}/**  myname!*///判断功能:boolean isEmpty = list.isEmpty();boolean isContain = list.contains("my");//长度功能:int size = list.size();//把集合转换成数组:String[] strArray = list.toArray(new String[]{});//删除功能:list.remove(0);list.remove("world");list.clear();System.out.println("ArrayList当前容量:"+list.size());// ArrayList当前容量:0}
}

3.2 LinkedList 基本操作

public class LinkedListTest {public static void main(String[] agrs){List<String> linkedList = new LinkedList<String>();System.out.println("LinkedList初始容量:"+linkedList.size());// LinkedList初始容量:0//添加功能:linkedList.add("my");linkedList.add("name");linkedList.add("is");linkedList.add("jiaboyan");System.out.println("LinkedList当前容量:"+ linkedList.size());// LinkedList当前容量:4//修改功能:linkedList.set(0,"hello");linkedList.set(1,"world");System.out.println("LinkedList当前内容:"+ linkedList.toString());// LinkedList当前内容:[hello, world, is, jiaboyan]//获取功能:String element = linkedList.get(0);System.out.println(element);// hello//遍历集合:(LinkedList实际的迭代器是ListItr对象)Iterator<String> iterator =  linkedList.iterator();while(iterator.hasNext()){String next = iterator.next();System.out.println(next);}/**helloworldisjiaboyan*///for循环迭代集合:for(String str:linkedList){System.out.println(str);}/**helloworldisjiaboyan*///判断功能:boolean isEmpty = linkedList.isEmpty();boolean isContains = linkedList.contains("jiaboyan");//长度功能:int size = linkedList.size();//删除功能:linkedList.remove(0);linkedList.remove("jiaboyan");linkedList.clear();System.out.println("LinkedList当前容量:" + linkedList.size());// LinkedList当前容量:0}
}

4.ArrayList和LinkedList比较

元素新增性能比较

网上很多说的是,在做新增操作时,ArrayList的效率远不如LinkedList,因为Arraylist底层时数组实现的,在动态扩容时,性能会有所损耗,而LinkedList不存在数组扩容机制,所以LinkedList的新增性能较好。究竟时哪个好呢,我们用实践得到结果。

public class ListTest{// 迭代次数public static int ITERATION_NUM = 100000;public static void main(String[] args) {try{insertPerformanceCompare();}catch (Exception e){}}//新增性能比较:public static void insertPerformanceCompare() throws InterruptedException {Thread.sleep(5000);long start = System.nanoTime();List<Integer> linkedList = new LinkedList<Integer>();for (int x = 0; x < ITERATION_NUM; x++) {linkedList.add(x);}long end = System.nanoTime();System.out.println("LinkedList获取测试开始 " + (end - start));start = System.nanoTime();List<Integer> arrayList = new ArrayList<Integer>();for (int x = 0; x < ITERATION_NUM; x++) {arrayList.add(x);}end = System.nanoTime();System.out.println("ArrayList获取测试开始 " + (end - start));}
}

测试结果:

第一次:
LinkedList新增测试开始 10873720
ArrayList新增测试开始 5535277
第二次:
LinkedList新增测试开始 13097503
ArrayList新增测试开始 6046139
第三次:
LinkedList新增测试开始 12004669
ArrayList新增测试开始 6509783

结果与预想的有些不太一样,ArrayList的新增性能并不低。

原因:

​ 可能是经过JDK近几年的更新发展,对于数组复制的实现进行了优化,以至于ArrayList的性能也得到了提高。

元素获取比较

由于LinkedList是链表结构,没有角标的概念,没有实现RandomAccess接口,不具备随机元素访问功能,所以在get方面表现的差强人意,ArrayList再一次完胜。

public class ListTest {//迭代次数,集合大小:public static int ITERATION_NUM = 100000;public static void main(String[] agrs) {try{getPerformanceCompare();}catch (Exception e){}}//获取性能比较:public static void getPerformanceCompare()throws InterruptedException {Thread.sleep(5000);//填充ArrayList集合:List<Integer> arrayList = new ArrayList<Integer>();for (int x = 0; x < ITERATION_NUM; x++) {arrayList.add(x);}//填充LinkedList集合:List<Integer> linkedList = new LinkedList<Integer>();for (int x = 0; x < ITERATION_NUM; x++) {linkedList.add(x);}//创建随机数对象:Random random = new Random();long start = System.nanoTime();for (int x = 0; x < ITERATION_NUM; x++) {int j = random.nextInt(x + 1);int k = linkedList.get(j);}long end = System.nanoTime();System.out.println("LinkedList获取测试开始 " + (end - start));start = System.nanoTime();for (int x = 0; x < ITERATION_NUM; x++) {int j = random.nextInt(x + 1);int k = arrayList.get(j);}end = System.nanoTime();System.out.println("ArrayList获取测试开始 " + (end - start));}
}

测试结果:

第一次:
LinkedList获取测试开始 8190063123
ArrayList获取测试开始 8590205
第二次:
LinkedList获取测试开始 8100623160
ArrayList获取测试开始 11948919
第三次:
LinkedList获取测试开始 8237722833
ArrayList获取测试开始 6333427


http://chatgpt.dhexx.cn/article/6MENcV04.shtml

相关文章

java中的集合 最全面的集合讲解

集合只能存储对象&#xff0c;长度可变的数据结构 Collection是一个接口&#xff0c;没有办法创建对象&#xff0c;所以需要它的子类来创建对象&#xff0c;创建对象的时候可以使用多态。 一、Collection中通用的方法 方法&#xff1a; 创建集合对象&#xff0c;会自动重写t…

Java中List集合与Set集合

目录 一、List 集合 1、List 接口特点 2、List 接口中常用的方法 3、List 集合存储数据结构 4、ArrayList 集合ArrayList 集合是最常用的集合&#xff0c;是用存储数据结构&#xff0c;元素增删慢&#xff0c;查找快。 5、LinkedList 集合 6、Vector 集合 二、Set 接口…

Java中的集合类

Java中所有的类都位于java.util包下&#xff0c;主要由两个接口派生出来。分别是Collection&#xff08;集合&#xff09;和Map.Collection&#xff08;映射集合&#xff09;&#xff0c;包含了List和Set两大分支。Map是一个映射接口。Set、Map、List&#xff08;集&#xff0c…

java中的集合详解

Collection接口和Map接口 1 Collection集合 1.1 集合概述 集合&#xff1a;集合是java中提供的一种容器&#xff0c;可以用来存储多个数据。集合和数组既然都是容器&#xff0c;它们有啥区别呢&#xff1f; 数组的长度是固定的。集合的长度是可变的。 数组中存储的是同一类型的…

java中的集合

1.集合概述 Java的集合框架是由很多接口、抽象类、具体类组成的&#xff0c;都位于java.util包中。 2.Collection接口 Collection 接口&#xff0d;定义了存取一组对象的方法&#xff0c;其子接口Set和List分别定义了存储方式。Set 中的数据对象没有顺序且不可以重复。 List…

Java——集合(超详细超级全)

集合 Java 集合类可以用于存储数量不等的多个对象&#xff0c;还可用于保存具有映射关系的关联数组。 在这里主要讲一些我们平常很常用的一些接口和一些实现类。 Java 集合可分为 Collection 和 Map 两种体系&#xff1a; Collection接口&#xff1a;单列数据&#xff0c;定…

java集合(超详细)

1 - 概述 所有的集合类和集合接口都在java.util包下。 在内存中申请一块空间用来存储数据&#xff0c;在Java中集合就是替换掉定长的数组的一种引用数据类型。 2 - 集合与数组的区别 长度区别 数组长度固定&#xff0c;定义长了造成内存空间的浪费&#xff0c;定义短了不够用…

java创建多线程的方法

Java中是可以创建多个线程的&#xff0c;每个线程都有自己的名字和时间戳。下面我们来看看创建多个线程的方法。 创建多个线程&#xff0c;需要使用到 Thread类中的 create方法。需要注意的是&#xff0c;不是所有的线程都可以使用 create方法来创建&#xff0c;只有当这些线程…

Java创建多线程的五种方法

Java创建多线程的五种方法 Java创建多线程的五种方法&#xff08;一&#xff09;继承Thread类1&#xff0e;实现描述2&#xff0e;具体步骤3&#xff0e;代码实现4&#xff0e;注意事项 &#xff08;二&#xff09;实现Runnable接口1&#xff0e;实现描述2&#xff0e;具体步骤…

Java创建线程(Lambda表达式创建线程)

一、创建线程三种方式 1.1 继承Thread类创建线程类&#xff08;main线程与t线程交替执行&#xff09; 1.2 通过Runnable接口创建线程类 弊端是:不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方法,代码复杂 上述代码中Thread.currentThread()方法返回当…

java创建线程的四种方法

第一种: 通过继承Thread类创建线程 第二种: 通过实现Runnable接口创建线程 这两种早已烂记于心,这里就不作过多的介绍, 主要介绍其源码 Thread类 implements Runnable thread空线程的run方法 是判断target是否存在实,再执行target实例中的run方法 public void run(){if(th…

Java创建线程

目录 既然说到线程&#xff0c;在这里就给大家普及一下线程。 线程&#xff08;Thread&#xff09;&#xff1a; 那么&#xff0c;进程是什么呢&#xff1f; 接下来&#xff0c;就让我们步入主题&#xff1a; 在 Java 中&#xff0c;是这样说线程的&#xff1a; 创建一个新…

Java创建多线程的8种方式

目录 1、继承Thread类&#xff0c;重写run()方法 2、实现Runnable接口&#xff0c;重写run() 3、匿名内部类的方式 4、带返回值的线程(实现implements Callable<返回值类型>)————以上3种方式&#xff0c;都没有返回值且都无法抛出异常。 5、定时器(java.util.Timer)…

java如何创建线程

java如何创建线程 1. java如何创建线程1.1 通过继承Thread类来创建线程1.2 通过实现Runnable接口来创建线程1.3 通过匿名内部类来创建线程1.4 lambda表达式1.5 通过实现Runnable接口的方式创建线程目标类的优缺点 1. java如何创建线程 一个线程在Java中使用一个Thread实例来描…

Java多线程 - Java创建线程的4种方式

文章目录 1. Java创建线程有哪几种方式&#xff1f;1.1 线程创建方法一&#xff1a;继承Thread类创建线程类1.2 线程创建方法二&#xff1a;实现Runnable接口创建线程目标类1.5 线程创建方法三&#xff1a;使用Callable和FutureTask创建线程1.6 线程创建方法四&#xff1a;通过…

java创建线程的四种方式

1&#xff09;继承Thread类创建线程 如图所示: //继承Thread类 class Aclass extends Thread{//输出100以内的偶数Overridepublic void run() {for (int i 1; i <100; i) {System.out.println(getName()":"i);}} } 测试: Thread t1 new Aclass();t1.setName…

Java创建线程的七种方法,全网最全面总结~

目录 前言 一、继承Thread&#xff0c;重写run方法 二、实现Runnable接口&#xff0c;重写run方法 三、使用匿名内部类创建 Thread 子类对象 四、使用匿名内部类&#xff0c;实现Runnable接口 五、lambda表达式 六、实现Callable接口 七、使用线程池创建线程 前言 属于基…

java创建线程(Thread)的5种方式

java创建线程&#xff08;Thread&#xff09;的5种方式 方式一&#xff1a;继承于Thread类方式二&#xff1a;实现Runnable接口方式三&#xff1a;实现Callable接口方式四&#xff1a;使用线程池方式五&#xff1a;使用匿名类 方式一&#xff1a;继承于Thread类 步骤&#xff1…

前端开发与vscode开发工具介绍

文章目录 1、前端开发2、vscode安装和使用2.1、下载地址2.2、插件安装2.3、设置字体大小2.4、开启完整的Emmet语法支持2.5、创建项目2.6、保存工作区2.7、新建文件夹和网页 1、前端开发 前端工程师“Front-End-Developer”源自于美国。大约从2005年开始正式的前端工程师角色被…

IntelliJ IDE 插件开发指南

作者介绍 洪进锋&#xff0c;字节跳动后端研发工程师&#xff0c;参与过高并发系统&#xff08;百万QPS&#xff09;设计与研发工作。在开源项目方面混过 Sharding-JDBC 的 PR。个人开发的 IntelliJ IDE 插件 Redis Manager&#xff0c;目前在官方插件库中下载量 30K&#xff0…