java数据结构--List的介绍

一、什么是List

在 Java 中,Listjava.util包下的一个接口 ,继承自Collection接口,是 Java 集合框架的重要组成部分。它用于存储有序的、可重复的元素集合,允许通过索引(位置)访问元素。

List 的核心特性:

  • 有序性:元素的插入顺序与存储顺序一致
  • 可重复性 :允许包含相同的元素(通过equals()方法判断)
  • 索引访问:可以通过整数索引(从 0 开始)精确访问、修改元素
  • 动态容量 :大多数实现类(如ArrayList)会自动扩容,无需手动指定大小

常见的 List 实现类:

  • **ArrayList:**基于动态数组实现,查询效率高,增删效率低(尤其中间位置)
  • **LinkedList:**基于双向链表实现,增删效率高,查询效率低
  • Vector 线程安全的动态数组(已基本被ArrayList替代)
  • Stack 继承自Vector,实现栈结构(推荐使用Deque替代)

二、List 接口的常见方法

List 接口继承了Collection的所有方法,并增加了针对索引操作的特有方法,主要包括:

2.1.添加元素

  • boolean add(E e):在列表末尾添加元素
  • void add(int index, E element):在指定索引处插入元素
  • boolean addAll(Collection<? extends E> c):添加集合中所有元素到末尾
  • boolean addAll(int index, Collection<? extends E> c):从指定索引开始添加集合元素

2.2.删除元素

  • E remove(int index):删除并返回指定索引处的元素
  • boolean remove(Object o):删除第一个与指定对象相等的元素
  • boolean removeAll(Collection<?> c):删除所有包含在指定集合中的元素
  • void clear():清空列表所有元素

2.3.修改元素

  • E set(int index, E element):替换指定索引处的元素,并返回旧元素

2.4.查询元素

  • E get(int index):返回指定索引处的元素
  • int indexOf(Object o):返回第一个与指定对象相等的元素索引(不存在返回 - 1)
  • int lastIndexOf(Object o):返回最后一个与指定对象相等的元素索引
  • boolean contains(Object o):判断列表是否包含指定元素
  • int size():返回列表元素个数
  • boolean isEmpty():判断列表是否为空

2.5.其他操作

  • List<E> subList(int fromIndex, int toIndex):返回从fromIndex(包含)到toIndex(不包含)的子列表
  • Object[] toArray():将列表转换为数组
  • Iterator<E> iterator():返回迭代器,用于遍历元素

三、List的使用

下面以最常用的ArrayList为例,演示 List 的基本使用:

java 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;

public class ListExample {
    public static void main(String[] args) {
        // 1. 创建List对象(多态写法,推荐使用接口引用)
        List<String> fruits = new ArrayList<>();
        
        // 2. 添加元素
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Cherry");
        fruits.add(1, "Blueberry"); // 在索引1处插入元素
        
        System.out.println("列表元素: " + fruits); 
        // 输出: [Apple, Blueberry, Banana, Cherry]
        
        // 3. 访问元素
        String firstFruit = fruits.get(0);
        System.out.println("第一个元素: " + firstFruit); // 输出: Apple
        
        // 4. 修改元素
        String oldFruit = fruits.set(2, "Grape");
        System.out.println("被替换的元素: " + oldFruit); // 输出: Banana
        System.out.println("修改后列表: " + fruits); 
        // 输出: [Apple, Blueberry, Grape, Cherry]
        
        // 5. 删除元素
        String removedFruit = fruits.remove(3);
        System.out.println("删除的元素: " + removedFruit); // 输出: Cherry
        
        // 6. 遍历元素(三种方式)
        System.out.println("\n遍历方式1: for循环");
        for (int i = 0; i < fruits.size(); i++) {
            System.out.println(fruits.get(i));
        }
        
        System.out.println("\n遍历方式2: 增强for循环");
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
        
        System.out.println("\n遍历方式3: 迭代器");
        Iterator<String> iterator = fruits.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        
        // 7. 其他常用操作
        System.out.println("\n是否包含Apple: " + fruits.contains("Apple")); // true
        System.out.println("元素个数: " + fruits.size()); // 3
        System.out.println("是否为空: " + fruits.isEmpty()); // false
        
        // 8. 清空列表
        fruits.clear();
        System.out.println("清空后是否为空: " + fruits.isEmpty()); // true
    }
}

使用场景选择

  • 频繁查询、较少增删时,优先使用ArrayList
  • 频繁在中间位置增删、较少查询时,优先使用LinkedList
  • 需要线程安全时,可使用Collections.synchronizedList(List)包装普通 List

List 是 Java 中最常用的集合类型之一,熟练掌握其用法对于处理有序数据集合至关重要。

相关推荐
Scott9999HH42 分钟前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔1 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社2 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海2 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖3 小时前
JDK 26 新特性详解
java·开发语言
马优晨3 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区5 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大6 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai6 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说6 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json