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

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 【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应用。

目录
相关文章
|
3天前
|
存储 Java 容器
Java一分钟之-高级集合框架:LinkedList与TreeSet
【5月更文挑战第17天】这篇博客对比了Java集合框架中的LinkedList和TreeSet。LinkedList是双向链表,适合中间插入删除,但遍历效率低且占用空间大;TreeSet基于红黑树,保证元素有序且不重复,插入删除速度较LinkedList慢但查找快。选择时需根据操作需求和性能考虑。
12 2
|
3天前
|
存储 Java 索引
Java ArrayList
5月更文挑战第11天
|
1天前
|
Python
两个list集合合并成一个python教程 - 蓝易云
在这两种方法中,加号会创建一个新的列表,而extend方法则会在原地修改列表。
6 0
|
2天前
|
安全 Java 容器
Java一分钟之-高级集合框架:并发集合(Collections.synchronizedXXX)
【5月更文挑战第18天】Java集合框架的`Collections.synchronizedXXX`方法可将普通集合转为线程安全,但使用时需注意常见问题和易错点。错误的同步范围(仅同步单个操作而非迭代)可能导致并发修改异常;错误地同步整个集合类可能引起死锁;并发遍历和修改集合需使用`Iterator`避免`ConcurrentModificationException`。示例代码展示了正确使用同步集合的方法。在复杂并发场景下,推荐使用`java.util.concurrent`包中的并发集合以提高性能。
16 3
|
2天前
|
Java 开发者
Java一分钟之-高级集合框架:优先队列(PriorityQueue)
【5月更文挑战第18天】`PriorityQueue`是Java集合框架中的无界优先队列,基于堆数据结构实现,保证队头元素总是最小。常见操作包括`add(E e)`、`offer(E e)`、`poll()`和`peek()`。元素排序遵循自然排序或自定义`Comparator`。常见问题包括错误的排序逻辑、可变对象排序属性修改和混淆`poll()`与`peek()`。示例展示了自然排序和使用`Comparator`的排序方式。正确理解和使用`PriorityQueue`能提升应用性能。
34 6
|
2天前
|
存储 Java
Java一分钟之-高级集合框架:Queue与Deque接口
【5月更文挑战第18天】本文探讨Java集合框架中的`Queue`和`Deque`接口,两者都是元素序列的数据结构。`Queue`遵循FIFO原则,主要操作有`add/remove/element/peek`,空队列操作会抛出`NoSuchElementException`。`Deque`扩展`Queue`,支持首尾插入删除,同样需注意空`Deque`操作。理解并正确使用这两个接口,结合具体需求选择合适数据结构,能提升代码效率和可维护性。
27 4
|
3天前
|
算法 Java C++
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
|
4天前
|
算法 Java Python
保姆级Java入门练习教程,附代码讲解,小白零基础入门必备
保姆级Java入门练习教程,附代码讲解,小白零基础入门必备
|
4天前
|
存储 算法 Java
Java 集合框架
5月更文挑战第10天
|
5天前
|
存储 安全 Java
【JAVA基础篇教学】第八篇:Java中List详解说明
【JAVA基础篇教学】第八篇:Java中List详解说明