Java一分钟之-Java集合框架入门:List接口与ArrayList

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
Elasticsearch Serverless检索通用型,资源抵扣包 100CU*H
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 【5月更文挑战第10天】本文介绍了Java集合框架中的`List`接口和`ArrayList`实现类。`List`是有序集合,支持元素重复并能按索引访问。核心方法包括添加、删除、获取和设置元素。`ArrayList`基于动态数组,提供高效随机访问和自动扩容,但非线程安全。文章讨论了三个常见问题:索引越界、遍历时修改集合和并发修改,并给出避免策略。通过示例代码展示了基本操作和安全遍历删除。理解并正确使用`List`和`ArrayList`能提升程序效率和稳定性。

Java集合框架是Java编程中处理数据结构的核心部分,它提供了一套性能优良、使用灵活的数据结构和算法实现。在众多集合类型中,List接口及其最常用的实现类ArrayList是开发中最常接触的。本文将深入浅出地介绍List接口与ArrayList的特性、常见问题、易错点及避免策略,并通过代码示例加以说明。
image.png

一、List接口概览

List接口继承自Collection接口,它是一种有序的集合,允许元素重复,并提供了按索引访问元素的能力。List接口定义了许多操作列表的方法,如添加、删除、修改指定位置的元素,以及搜索特定元素等。

核心方法

  • add(E element): 在列表末尾添加元素。
  • add(int index, E element): 在指定位置插入元素。
  • get(int index): 返回指定位置的元素。
  • set(int index, E element): 用新的元素替换指定位置的元素。
  • remove(int index): 删除指定位置的元素。
  • indexOf(Object o): 返回指定元素首次出现的位置,未找到返回-1。

二、ArrayList介绍

ArrayListList接口的一个可变大小的数组实现。它允许所有元素,包括null。内部使用一个动态数组来存储元素,随着元素的增加,其容量会自动增长。

特性

  • 高效随机访问:由于底层使用数组,通过索引访问元素非常快。
  • 动态扩容:当数组空间不足时,ArrayList会自动创建更大的数组,并将原数组内容复制到新数组中。
  • 非线程安全:在多线程环境下,直接修改ArrayList可能引发并发问题,需使用Collections.synchronizedListCopyOnWriteArrayList进行同步控制。

三、常见问题与易错点

1. 索引越界

问题:尝试访问或修改不存在的索引位置的元素。 示例

List<String> list = new ArrayList<>();
list.add("Hello");
System.out.println(list.get(1)); // 抛出IndexOutOfBoundsException

避免:确保索引值在合法范围内,使用size()方法检查集合大小。

2. 遍历过程中修改集合

问题:在迭代过程中直接修改集合会导致ConcurrentModificationException示例

List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
for (String s : list) {
   
   
    if ("B".equals(s)) {
   
   
        list.remove(s); // 运行时错误
    }
}

避免:使用迭代器的Iterator.remove()方法进行安全删除,或者使用ListIterator进行增删改查操作。

3. 忽视ArrayList非线程安全

问题:在多线程环境下直接修改ArrayList可能导致数据不一致。 示例:两个线程同时对ArrayList进行添加操作。 避免:使用线程安全的集合类,如VectorCollections.synchronizedList(new ArrayList<...>())

四、代码示例

基本操作

List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
names.add("Charlie");

// 添加元素至指定位置
names.add(1, "David");

// 修改元素
names.set(4, "Eve");

// 删除元素
names.remove("Bob");

// 遍历
for (String name : names) {
   
   
    System.out.println(name);
}

// 搜索元素
if (names.contains("Eve")) {
   
   
    System.out.println("Found Eve");
}

安全遍历删除

java
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
    String name = iterator.next();
    if ("Charlie".equals(name)) {
        iterator.remove();
    }
}

五、总结

List接口与其实现类ArrayList是Java集合框架中的重要组成部分,提供了灵活的列表数据结构支持。正确理解和使用它们,可以有效提高程序的效率和稳定性。避免常见的索引越界、并发修改异常等问题,是日常开发中需要注意的关键点。通过合理选择集合类型、谨慎处理集合操作,可以充分发挥ArrayList的优势,构建更加健壮的Java应用。

目录
相关文章
|
1月前
|
消息中间件 算法 安全
JUC并发—1.Java集合包底层源码剖析
本文主要对JDK中的集合包源码进行了剖析。
|
1月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
242 70
|
1月前
|
Java
Java LinkedList集合的深度剖析
总的来说,我希望像说故事一样讲解Java LinkedList集合的使用和实现原理,让有些许枯燥的编程知识变得趣味盎然。在这个“公交车”故事中,你不仅熟悉了LinkedList集合的实现和使用,而且还更深入地理解了数据结构中的链表。链表可能会因为插入和删除的便利性而被选用,虽然它的查找效率并不高,但是在很多场景中仍然十分有效。这就像公交车,虽然它速度不快,但却是城市出行的重要工具。
61 8
|
2月前
|
机器学习/深度学习 人工智能 Java
Java机器学习实战:基于DJL框架的手写数字识别全解析
在人工智能蓬勃发展的今天,Python凭借丰富的生态库(如TensorFlow、PyTorch)成为AI开发的首选语言。但Java作为企业级应用的基石,其在生产环境部署、性能优化和工程化方面的优势不容忽视。DJL(Deep Java Library)的出现完美填补了Java在深度学习领域的空白,它提供了一套统一的API,允许开发者无缝对接主流深度学习框架,将AI模型高效部署到Java生态中。本文将通过手写数字识别的完整流程,深入解析DJL框架的核心机制与应用实践。
141 3
|
1月前
|
存储 安全 Java
Java 集合框架详解:系统化分析与高级应用
本文深入解析Java集合框架,涵盖List、Set、Map等核心接口及其常见实现类,如ArrayList、HashSet、HashMap等。通过对比不同集合类型的特性与应用场景,帮助开发者选择最优方案。同时介绍Iterator迭代机制、Collections工具类及Stream API等高级功能,提升代码效率与可维护性。适合初学者与进阶开发者系统学习与实践。
65 0
|
2月前
|
Java
java常见的集合类有哪些
Map接口和Collection接口是所有集合框架的父接口: 1. Collection接口的子接口包括:Set接口和List接口 2. Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及 Properties等 3. Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 4. List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
|
2月前
|
存储 并行计算 Java
java 中的fork join框架
Java中的Fork Join框架于Java 7引入,旨在提升并行计算能力。它通过“分而治之”的思想,将大任务拆分为多个小任务(fork),再将结果合并(join)。核心组件包括:ForkJoinPool(管理线程池和工作窃取机制)、ForkJoinWorkerThread(执行具体任务的工作线程)和ForkJoinTask(定义任务逻辑,常用子类为RecursiveAction和RecursiveTask)。框架支持通过invoke、fork/join等方式提交任务,广泛应用于高性能并发场景。
|
SQL Java 数据库连接
Java面试题日积月累(SSM框架面试题22道)
Java面试题日积月累(SSM框架面试题22道)
178 0
|
10月前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
112 1
|
10月前
|
SQL Java 数据库连接
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
162 0