List 接口

本文深入解析了List接口及其主要实现类ArrayList、Vector和Stack的特点与用法。探讨了List集合的特性,如有序、可重复、存储null值及线程安全性,并详细介绍了各方法的使用场景,对比了ArrayList与Vector的性能差异。

List接口

概述

有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
Collection将集合划分为两大类:**

List集合
Set集合
List接口的特点

有序【存储有序】

可重复

可以存储 null值

部分子集合线程安全,部分不安全 例如 ArrayList 和 Vector

有索引,针对每个元素能够方便地查询和修改

判断元素是否重复依赖于equals方法

​	a. 如果元素是系统类,不需要重写equals方法

​ b. 如果是自定义类,就需要我们按需求重写 equals方法

List接口的常用方法

增加

void add(int index, E element) 在指定 index 索引处理插入元素 element
boolean addAll(int index, Collection<? extends E> c) 在指定 index 索引处理插入集合元素 c
1
2
删除

E remove(int index) 删除指定索引 index 处的元素
1
修改

E set(int index, E element) 修改指定索引 index 处的元素为 element			
1
遍历

E get(int index) + int size() for循环遍历集合中的每一个元素
ListIterator<E> listIterator() 通过列表迭代器遍历集合中的每一个元素
ListIterator<E> listIterator(int index) 通过列表迭代器从指定索引处开始正向或者逆向遍历集合中的元素
1
2
3
获取

E get(int index) 获取指定索引处的元素
int indexOf(Object o) 从左往右查找,获取指定元素在集合中的索引,如果元素不存在返回 -1
int lastIndexOf(Object o) 从右往左查找,获取指定元素在集合中的索引,如果元素不存在返回 -1
List<E> subList(int fromIndex, int toIndex) 截取从 fromIndex 开始到 toIndex-1 处的元素
1
2
3
4
List接口的遍历方式

toArray
Iterator
foreach
普通for
ListIterator
List接口去除重复元素

​	方式一:创建一个新的集合去除重复元素再使用地址传递

​	方式二:在原集合的基础上使用选择排序思想去除重复元素

List<String> list = new ArrayList<String>();
		list.add("张三");
		list.add("李四");
		list.add("李四");
		list.add("李四");
		list.add("王五");

for (int i = 0; i < list.size(); i++) {
    for (int j = i + 1; j < list.size(); j++) {
        if (list.get(i).equals(list.get(j))) {
            list.remove(j);
            j--;
        }
    }
}

并发修改异常的处理

异常名称:并发修改异常 java.util.ConcurrentModificationException

产生原因:在使用迭代器迭代的同时使用原集合对元素做了修改

解决办法:

使用 toArray 方法

使用 普通 for 遍历

使用 ListIterator 遍历集合并且使用 列表迭代器修改元素

## ArrayList

概述

List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现
List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector类,除了此类是不同步的。)
特点

底层数据结构是数组
增加和删除的效率低,查询和修改的效率高
能够存储 null 值
线程不安全,效率高 可以通过 Collections.synchronizedList();变安全
有索引,能够方便检索
元素可重复,我们自己可以通过 选择排序去重复
不可以排序,但是可以通过 Collections.sort();方法排序
注:ArrayList中常用的方法全部来自于 父类 Collection,List,Object.这里不再做详细叙述。

Vector

概述

Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。
特点

底层数据结构是数组
有索引,能够方便检索
增加和删除的效率低,查询和修改的效率高
线程安全,效率低
能够存储 null 值
元素可重复【我们自己可以通过选择排序思想去除重复元素】
不可以排序,但是可以通过 Collections.sort();方法排序
常用方法

增加

public synchronized void addElement(E obj) 添加元素 obj 到集合中
public synchronized void insertElementAt(E obj, int index) 在指定索引 index 处插入元素 obj
1
2
删除

public synchronized void removeElementAt(int index) 移除指定索引 index 处的元素
public synchronized void removeAllElements() 移除所有元素
1
2
修改

public synchronized void setElementAt(E obj, int index) 修改指定索引 index 的元素为 obj
1
遍历

public synchronized E elementAt(int index) + size() for循环遍历集合中的所有元素
public synchronized Enumeration<E> elements() 使用 Enumeration 迭代器遍历集合中的元素
1
2
获取

public synchronized E firstElement() 获取集合中的第一个元素
public synchronized E lastElement() 获取集合中的最后一个元素
public synchronized E elementAt(int index) 获取指定索引 index 的元素

相关面试题

ArrayList和Vector的区别?
1)  Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。 
2) 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。

Stack

概述

Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。
特点

基于栈结构的集合,先进后出
Stack 类是 Vector类的子类,所以该类也是线程安全的,效率低,建议使用 Deque接口的实现类
常用方法

E push(E item) 将元素压入栈底
E pop() 将元素从栈结构中弹出,并作为此函数的值返回该对象,此方法会影响栈结构的大小
E peek() 查看堆栈顶部的对象,但不从栈中移除它。
boolean empty() 测试栈是否为空。
int search(Object o) 返回对象在栈中的位置,以 1 为基数。

注:如果栈中元素为空,再尝试弹栈,将会抛出 EmptyStackException 异常, 而不是 NoSuchElementException

示例代码如下:

Stack<String> stack = new Stack<>();
// 压栈
stack.push("A");
stack.push("B");
stack.push("C");

while (!stack.isEmpty()) {
    System.out.println("栈顶元素:" + stack.peek());
    // 弹栈
    System.out.println("弹出栈顶元素:" + stack.pop());
}
内容概要:本文为《科技类企业品牌传播白皮书》,系统阐述了新闻媒体发稿、自媒体博主种草与短视频矩阵覆盖三大核心传播策略,并结合“传声港”平台的AI工具与资源整合能力,提出适配科技企业的品牌传播解决方案。文章深入分析科技企业传播的特殊性,包括受众圈层化、技术复杂性与传播通俗性的矛盾、产品生命周期影响及2024-2025年传播新趋势,强调从“技术输出”向“价值引领”的战略升级。针对三种传播方式,分别从适用场景、操作流程、效果评估、成本效益、风险防控等方面提供详尽指南,并通过平台AI能力实现资源智能匹配、内容精准投放与全链路效果追踪,最终构建“信任—种草—曝光”三位一体的传播闭环。; 适合人群:科技类企业品牌与市场负责人、公关传播从业者、数字营销管理者及初创科技公司创始人;具备一定品牌传播基础,关注效果可量化与AI工具赋能的专业人士。; 使用场景及目标:①制定科技产品全生命周期的品牌传播策略;②优化媒体发稿、KOL合作与短视频运营的资源配置与ROI;③借助AI平台实现传播内容的精准触达、效果监测与风险控制;④提升品牌在技术可信度、用户信任与市场影响力方面的综合竞争力。; 阅读建议:建议结合传声港平台的实际工具模块(如AI选媒、达人匹配、数据驾驶舱)进行对照阅读,重点关注各阶段的标准化流程与数据指标基准,将理论策略与平台实操深度融合,推动品牌传播从经验驱动转向数据与工具双驱动。
【3D应力敏感度分析拓扑优化】【基于p-范数全局应力衡量的3D敏感度分析】基于伴随方法的有限元分析和p-范数应力敏感度分析(Matlab代码实现)内容概要:本文档围绕“基于p-范数全局应力衡量的3D应力敏感度分析”展开,介绍了一种结合伴随方法与有限元分析的拓扑优化技术,重点实现了3D结构在应力约束下的敏感度分析。文中详细阐述了p-范数应力聚合方法的理论基础及其在避免局部应力过高的优势,并通过Matlab代码实现完整的数值仿真流程,涵盖有限元建模、灵敏度计算、优化迭代等关键环节,适用于复杂三维结构的轻量化与高强度设计。; 适合人群:具备有限元分析基础、拓扑优化背景及Matlab编程能力的研究生、科研人员或从事结构设计的工程技术人员,尤其适合致力于力学仿真与优化算法开发的专业人士; 使用场景及目标:①应用于航空航天、机械制造、土木工程等领域中对结构强度和重量有高要求的设计优化;②帮助读者深入理解伴随法在应力约束优化中的应用,掌握p-范数法处理全局应力约束的技术细节;③为科研复现、论文写作及工程项目提供可运行的Matlab代码参考与算法验证平台; 阅读建议:建议读者结合文中提到的优化算法原理与Matlab代码同步调试,重点关注敏感度推导与有限元实现的衔接部分,同时推荐使用提供的网盘资源获取完整代码与测试案例,以提升学习效率与实践效果。
源码来自:https://pan.quark.cn/s/e1bc39762118 SmartControlAndroidMQTT 点个Star吧~ 如果不会用下载或是下载慢的,可以在到酷安下载:https://www.coolapk.com/apk/com.zyc.zcontrol 本文档还在编写中!!! 被控设备: 按键伴侣ButtonMate 直接控制墙壁开关,在不修改墙壁开关的前提下实现智能开关的效果 zTC1_a1 斐讯排插TC1重新开发固件,仅支持a1版本. zDC1 斐讯排插DC1重新开发固件. zA1 斐讯空气净化器悟净A1重新开发固件. zM1 斐讯空气检测仪悟空M1重新开发固件. zS7 斐讯体重秤S7重新开发固件.(仅支持体重,不支持体脂) zClock时钟 基于esp8266的数码管时钟 zMOPS插座 基于MOPS插座开发固件 RGBW灯 基于ESP8266的rgbw灯泡 zClock点阵时钟 基于ESP8266的点阵时钟 使用说明 此app于设备通信通过udp广播或mqtt服务器通信.udp广播为在整个局域网(255.255.255.255)的10181和10182端口通信.由于udp广播的特性,udp局域网通信不稳定,建议有条件的还是使用mqtt服务器来通信. app设置 在侧边栏点击设置,进入设置页面.可设置mqtt服务器.(此处总是通过UDP连接选项无效!) 设备控制页面 (每总设备页面不同) 界面下方的服务器已连接、服务器已断开 是指app与mqtt服务器连接状态显示.与设备连接状态无关. 右上角,云图标为与设备同步mqtt服务器配置.由于可以自定义mqtt服务器,所以除了需要将手机连入mqtt服务器外,还需要将被控设备连入...
<think>首先,用户的问题是:“我想了解list接口是什么 请问list接口定义及作用介绍”。这是在询问Java中的List接口的定义和作用。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题,保证真实可靠。 从站内引用中,引用了多个来源: - 引用[1]:定义了List接口继承自Collection,并提到它是一个线性表。 - 引用[2]:提到了List的构造函数和使用。 - 引用[3]:解释了List的底层实现是双向链表,支持高效插入和删除。 - 引用[4]:展示了ArrayList的使用,包括遍历方式。 用户的问题是关于List接口的定义和作用,所以我需要基于这些引用构建一个清晰的解释。 关键点从引用中提取: - List是一个接口,继承自Collection接口([^1])。 - Collection接口定义了容器常用的方法([^1])。 - Iterable接口表明List是可遍历的([^1])。 - List代表一个线性表,是有限序列的元素([^1])。 - List支持增删改查和遍历操作([^1])。 - List的常见方法包括添加、删除、获取元素等()。 - List的实现类如ArrayList和LinkedList([^1], [^3])。 - List的底层可能是数组或链表,但在接口层面是抽象的([^3])。 - List在任意位置插入和删除高效,但不支持随机访问()。 回答结构应该清晰: 1. 定义List接口:是什么,继承关系。 2. 作用:为什么使用List,它的优点和特性。 3. 核心方法:常见的方法解释。 4. 实现类:简要提到ArrayList和LinkedList的区别。 5. 示例:如果需要,可以添加代码示例,但用户没有要求,引用[4]有代码,但焦点是接口。 用中文回答。 生成相关问题:在回答结束后,添加§§相关问题§§部分。 引用标识:在回答中引用时,在段落末尾添加[^n]。 现在,构建回答: - 开头定义List接口。 - 然后解释作用。 - 描述关键方法(基于引用[1]和[2])。 - 讨论实现(引用[3]和[4])。 确保数学表达式正确:用户问题中没有数学部分,但如果有数字或公式,要用LaTeX。例如,列表大小或索引,但可能不需要。 在回答中,当提到大小或位置时,可能用行内数学,如$n$个元素。 最后,生成相关问题。 </think> ### List接口的定义及作用介绍 List接口是Java集合框架中的核心组成部分,它定义了一种有序、可重复元素的容器规范。List继承自Collection接口(),而Collection则继承自Iterable接口,这表明List支持元素的遍历操作。从数据结构角度来看,List代表一个线性表(linear list),即由$n$个相同类型元素组成的有限序列,在该序列上可以执行添加、删除、修改、查询和遍历等操作([^1])。List接口的主要作用是提供一种标准化的方式存储和管理有序数据集合,特别适用于需要频繁插入、删除或顺序访问元素的场景()。 #### List接口的关键定义 - **接口继承关系**:List是Collection的子接口,Collection定义了容器的基础方法(如`add`, `remove`, `size`),而Iterable确保了List可被迭代(例如使用迭代器或增强for循环)()。 - **核心特性**: - List是一个抽象接口,不能直接实例化。必须通过其实现类(如ArrayList或LinkedList)来创建对象()。 - 元素有序:元素按插入顺序存储,每个元素有特定索引位置(从0开始)。 - 元素可重复:允许存储重复值(例如,可以添加多个相同元素)。 - 支持双向迭代:可通过迭代器从前向后或从后向前遍历元素()。 - **数学表示**:设List包含$n$个元素,序列表示为$[e_0, e_1, \dots, e_{n-1}]$,其中$e_i$表示索引为$i$的元素()。 #### List接口的主要作用 1. **高效的元素操作**: - List支持在任意位置高效插入和删除元素,时间复杂度接近$O(1)$(在LinkedList中),但随机访问(如通过索引获取元素)在链表实现中为$O(n)$([^3])。 - 相比数组(array)或其他序列容器(如vector),List在动态修改场景下性能更优,因为它避免了连续内存分配的开销([^3])。 2. **灵活的存储和访问**: - 提供丰富的方法,如`add(index, element)`(在指定索引插入)、`remove(index)`(删除指定元素)、`get(index)`(获取元素)和`set(index, element)`(修改元素)()。 - 支持多种遍历方式,包括for循环、foreach和使用迭代器(如引用[4]中的ArrayList示例)。 3. **实现类的适应性**: - **ArrayList**:基于动态数组实现,支持快速随机访问(时间复杂度$O(1)$),但插入/删除元素可能需要移动后续元素(时间复杂度$O(n)$)。 - **LinkedList**:基于双向链表实现,插入/删除高效(时间复杂度$O(1)$),但随机访问较慢(时间复杂度$O(n)$)()。 - 开发者可根据场景选择实现类:例如,ArrayList适合查询密集操作,LinkedList适合修改密集操作(, [^3])。 #### List接口常见方法示例 以下列出List的核心方法(基于引用[1]和[2]): - `boolean add(E element)`:添加元素到列表末尾。 - `void add(int index, E element)`:在指定索引插入元素。 - `E remove(int index)`:删除指定索引的元素。 - `E get(int index)`:返回指定索引的元素。 - `int size()`:返回列表大小(元素数量)。 - `Iterator<E> iterator()`:返回迭代器,用于遍历元素。 例如,在ArrayList中遍历元素(引用[4]): ```java List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); // 添加元素 // 遍历方式1: for循环+下标 for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i) + " "); } // 遍历方式2: foreach for (Integer num : list) { System.out.print(num + " "); } // 遍历方式3: 迭代器 Iterator<Integer> it = list.iterator(); while (it.hasNext()) { System.out.print(it.next() + " "); } ``` #### 总结 List接口提供了一种统一的方式处理有序集合,其设计平衡了灵活性和性能,特别适用于数据动态变化的场景(如缓存管理或实时数据处理)。选择具体实现类时需权衡访问和修改需求(, [^3])。如果您需要更深入的实现细节或代码示例,请参考相关文档。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值