Java List 集合详解:基础用法、常见实现类与高频面试题解析

正文

在 Java 集合框架中,List 是一个非常重要的接口,广泛用于存储有序的元素集合。本文将带你深入了解 List 接口的基本用法、常见实现类及其扩展,同时通过实际代码示例帮助你快速掌握这些知识。


👉点击获取2024Java学习资料

1. 什么是 List?

List 是 Java 集合框架中的一个接口,它继承了 Collection 接口,用于存储一组有序的元素。与普通数组相比,List 提供了动态调整大小和丰富操作方法的功能。

特点

  1. 元素有序,可通过索引访问。
  2. 允许存储重复的元素。
  3. 可以存储 null 值。

常用实现类

  • ArrayList
  • LinkedList
  • Vector
  • CopyOnWriteArrayList(线程安全)

2. List 的基本操作

以下是 List 接口的一些常用方法:

方法描述
add(E e)在列表末尾添加元素
add(int index, E e)在指定位置插入元素
get(int index)根据索引获取元素
set(int index, E e)修改指定索引的元素
remove(int index)移除指定索引的元素
size()返回列表中元素的数量
contains(Object o)判断列表是否包含指定元素
indexOf(Object o)返回元素的首次出现索引
isEmpty()判断列表是否为空

代码示例

import java.util.*;public class ListDemo {public static void main(String[] args) {List<String> list = new ArrayList<>();// 添加元素list.add("Java");list.add("Python");list.add("C++");// 插入元素list.add(1, "JavaScript");// 获取元素System.out.println("元素:" + list.get(1));// 修改元素list.set(2, "C#");// 删除元素list.remove(3);// 遍历列表for (String item : list) {System.out.println(item);}}
}

3. 常用的 List 实现类

3.1 ArrayList

ArrayList 是基于动态数组实现的列表,适合频繁查询的场景。

特点

  • 随机访问效率高。
  • 插入或删除时可能需要移动大量元素。
  • 非线程安全。

代码示例

import java.util.ArrayList;public class ArrayListExample {public static void main(String[] args) {ArrayList<Integer> numbers = new ArrayList<>();numbers.add(1);numbers.add(2);numbers.add(3);System.out.println("ArrayList: " + numbers);}
}

3.2 LinkedList

LinkedList 是基于双向链表实现的列表,适合频繁插入和删除的场景。

特点

  • 查询效率较低,需要从头开始遍历。
  • 插入和删除效率高。
  • 可以用作队列(Queue)或双端队列(Deque)。

代码示例

import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {LinkedList<String> queue = new LinkedList<>();queue.add("Alice");queue.add("Bob");queue.add("Charlie");System.out.println("LinkedList: " + queue);// 模拟队列操作System.out.println("Poll: " + queue.poll());  // 移除并返回队首元素}
}

3.3 Vector

Vector 是线程安全的动态数组,适合多线程场景。

特点

  • 每个方法都使用了同步机制。
  • 性能比 ArrayList 较低,但线程安全。

代码示例

import java.util.Vector;public class VectorExample {public static void main(String[] args) {Vector<String> vector = new Vector<>();vector.add("Apple");vector.add("Banana");vector.add("Cherry");System.out.println("Vector: " + vector);}
}

3.4 CopyOnWriteArrayList

CopyOnWriteArrayList 是线程安全的 ArrayList 实现,适合多线程且读多写少的场景。

特点

  • 每次修改时都会复制底层数组。
  • 读操作不需要锁,性能高。
  • 写操作的性能较低。

代码示例

import java.util.concurrent.CopyOnWriteArrayList;public class CopyOnWriteArrayListExample {public static void main(String[] args) {CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();list.add("Thread-safe");list.add("Example");System.out.println("CopyOnWriteArrayList: " + list);}
}

4. List 的扩展用法

4.1 排序操作

Collections.sort 方法可以对列表进行排序:

代码示例

import java.util.*;public class SortExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(5, 3, 8, 1);Collections.sort(numbers);System.out.println("排序后: " + numbers);}
}

4.2 遍历方式

  1. for-each 循环

    for (String item : list) {System.out.println(item);
    }
    
  2. Iterator

    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {System.out.println(iterator.next());
    }
    
  3. Stream API

    list.stream().forEach(System.out::println);
    

4.3 Stream 和 Lambda 表达式

利用 Stream 可以方便地对列表进行操作:

代码示例

import java.util.*;public class StreamExample {public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie");names.stream().filter(name -> name.startsWith("A")).forEach(System.out::println);}
}

5. 面试中关于 List 的高频问题

  1. ArrayList 和 LinkedList 的区别

    • ArrayList 基于数组,查询快,插入和删除慢。
    • LinkedList 基于链表,插入和删除快,查询慢。
  2. Vector 和 ArrayList 的区别

    • Vector 是线程安全的,ArrayList 是非线程安全的。
    • Vector 性能相对较低。
  3. 线程安全的 List 实现有哪些?

    • Vector
    • CopyOnWriteArrayList
  4. 如何避免 ConcurrentModificationException?

    • 使用 Iteratorremove 方法。
    • 使用线程安全的集合如 CopyOnWriteArrayList

6. 总结

List 是 Java 集合框架中非常重要的一部分,其各种实现类在不同的场景下各有优势。掌握 List 的基本用法和实现类的特性,不仅有助于日常开发,还能应对 Java 面试中的高频考察。

希望本文对你理解 List 及其常用扩展有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大白话拆解——多线程中关于死锁的一切(七)(已完结)

前言&#xff1a; 25年初&#xff0c;这个时候好多小伙伴都在备战期末 小编明天还有一科考试&#xff0c;日更一篇&#xff0c;今天这篇一定会对小白非常有用的&#xff01;&#xff01;&#xff01; 因为我们会把案例到用代码实现的全过程思路呈现出来&#xff01;&#xff…

GitLab集成Runner详细版--及注意事项汇总【最佳实践】

一、背景 看到网上很多用户提出的runner问题其实实际都不是问题&#xff0c;不过是因为对runner的一些细节不清楚导致了误解。本文不系统性的介绍GitLab-Runner&#xff0c;因为这类文章写得好的特别多&#xff0c;本文只汇总一些常几的问题/注意事项。旨在让新手少弯路。 二、…

《数据结构》期末考试测试题【中】

《数据结构》期末考试测试题【中】 21.循环队列队空的判断条件为&#xff1f;22. 单链表的存储密度比1&#xff1f;23.单链表的那些操作的效率受链表长度的影响&#xff1f;24.顺序表中某元素的地址为&#xff1f;25.m叉树第K层的结点数为&#xff1f;26. 在双向循环链表某节点…

「Mac畅玩鸿蒙与硬件54」UI互动应用篇31 - 滑动解锁屏幕功能

本篇教程将实现滑动解锁屏幕功能&#xff0c;通过 Slider 组件实现滑动操作&#xff0c;学习事件监听、状态更新和交互逻辑的实现方法。 关键词 滑动解锁UI交互状态管理动态更新事件监听 一、功能说明 滑动解锁屏幕功能包含以下功能&#xff1a; 滑动解锁区域&#xff1a;用…

螺栓松动丢失腐蚀生锈检测数据集VOC+YOLO格式504张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;504 标注数量(xml文件个数)&#xff1a;504 标注数量(txt文件个数)&#xff1a;504 标注…

Postman测试big-event

报错500。看弹幕&#xff0c;知道可能是yml或sql有问题。 所以检查idea工作台&#xff0c; 直接找UserMapper检查&#xff0c;发现完全OK。 顺着这个error发现可能是sql有问题。因为提示是sql问题&#xff0c;而且是有now()的那个sql。 之后通过给的课件&#xff0c;复制课件…

如何使用大语言模型进行事件抽取与关系抽取

诸神缄默不语-个人CSDN博文目录 文章目录 1. 什么是事件抽取与关系抽取&#xff1f;2. 示例&#xff1a;使用大语言模型进行事件抽取与关系抽取 1. 什么是事件抽取与关系抽取&#xff1f; 事件抽取是指从文本中识别出与某些“事件”相关的信息。这些事件通常包括动作、参与者、…

NAT网络技术

NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是一种常用的网络技术&#xff0c;主要用于在私有网络和公共网络之间转换IP地址。在家庭和小型企业网络当中用的比较多。它的主要功能有IP地址重用和增强网络的安全性。   NAT允许一个整个网…

SpringBoot框架开发中常用的注解

文章目录 接收HTTP请求。RestController全局异常处理器Component依赖注入LombokDataBuildersneakyThrowsRequiredArgsConstructor 读取yml文件配置类注解 接收HTTP请求。 RequestMapping 接收HTTP请求。具体一点是 GetMapping PostMapping PutMapping DeleteMapping 一共…

TVS二极管选型【EMC】

TVS器件并联在电路中&#xff0c;当电路正常工作时&#xff0c;他处于截止状态&#xff08;高阻态&#xff09;&#xff0c;不影响线路正常工作&#xff0c;当线路处于异常过压并达到其击穿电压时&#xff0c;他迅速由高阻态变为低阻态&#xff0c;给瞬间电流提供一个低阻抗导通…

Azkaban其二,具体使用以及告警设置

目录 Azkaban的使用 1、使用Flow1.0(比较老旧&#xff09; 2、Flow2.0的用法 1、小试牛刀 2、YAML格式的数据 3、多任务依赖 4、内嵌流&#xff08;嵌套流&#xff09;案例 5、动态传参 3、Azkaban的报警机制 1&#xff09;邮箱通知 2&#xff09;电话报警机制 4、关…

文档 | Rstudio下的轻量级单页面markdown阅读器 markdownReader

需求&#xff1a;在写R数据分析项目的时候&#xff0c;代码及结果的关键变化怎么记录下来&#xff1f;最好git能很容易的跟踪版本变化。 markdown 是最理想的选择&#xff0c;本文给出一种Rstuidio下的轻量级md阅读器实现&#xff1a;markdownReader。书写md还是在Rstudio。更…

SonarQube相关的maven配置及使用

一、maven 全局配置 <settings><pluginGroups><pluginGroup>org.sonarsource.scanner.maven</pluginGroup></pluginGroups><profiles><profile><id>sonar</id><activation><activeByDefault>true</acti…

Arduino Uno简介与使用方法

目录 一、Arduino Uno概述 1. 硬件特性 2. 开发环境 二、Arduino Uno的基本使用方法 1. 硬件连接 2. 软件编程 三、Arduino Uno编程基础 1. 基本语法 2. 常用函数 四、Arduino Uno应用举例 1. LED闪烁 2. 温度检测 3. 超声波测距 五、Arduino Uno的扩展与应用 1…

UniApp | 从入门到精通:开启全平台开发的大门

UniApp | 从入门到精通:开启全平台开发的大门 一、前言二、Uniapp 基础入门2.1 什么是 Uniapp2.2 开发环境搭建三、Uniapp 核心语法与组件3.1 模板语法3.2 组件使用四、页面路由与导航4.1 路由配置4.2 导航方法五、数据请求与处理5.1 发起请求5.2 数据缓存六、样式与布局6.1 样…

滑动窗口。

1456 定长子串中元音的最大数目 采用滑动窗口。每次移动一个位置&#xff0c;判断当前窗口内的子串内目标元素的个数&#xff0c;若比之前更大就更新结果。 如何判断是否更新结果&#xff1f;也即&#xff0c;如何判断当前窗口内所含目标元素个数&#xff0c;是否为遍历到这个…

公共数据授权运营系统建设手册(附下载)

在全球范围内&#xff0c;许多国家和地区已经开始探索公共数据授权运营的路径和模式。通过建立公共数据平台&#xff0c;推动数据的开放共享&#xff0c;促进数据的创新应用&#xff0c;不仅能够提高政府决策的科学性和公共服务的效率&#xff0c;还能够激发市场活力&#xff0…

电脑主机后置音频插孔无声?还得Realtek高清晰音频管理器调教

0 缘起 一台联想电脑&#xff0c;使用Windows 10 专业版32位&#xff0c;电脑主机后置音频插孔一直没有声音&#xff0c;所以音箱是接在机箱前面版的前置音频插孔上的。 一天不小心捱到了音箱的音频线&#xff0c;音频线头断在音频插孔里面了&#xff0c;前置音频插孔因此用不…

【微服务】1、引入;注册中心;OpenFeign

微服务技术学习引入 - 微服务自2016年起搜索指数持续增长&#xff0c;已成为企业开发大型项目的必备技术&#xff0c;中高级java工程师招聘多要求熟悉微服务相关技术。微服务架构介绍 概念&#xff1a;微服务是一种软件架构风格&#xff0c;以专注于单一职责的多个响应项目为基…

UDP_TCP

目录 1. 回顾端口号2. UDP协议2.1 理解报头2.2 UDP的特点2.3 UDP的缓冲区及注意事项 3. TCP协议3.1 报头3.2 流量控制2.3 数据发送模式3.4 捎带应答3.5 URG && 紧急指针3.6 PSH3.7 RES 1. 回顾端口号 在 TCP/IP 协议中&#xff0c;用 “源IP”&#xff0c; “源端口号”…