Java List 详解

devtools/2024/12/22 2:35:10/

Java List详解

Java中的List是Java集合框架(Java Collections Framework)的一部分,它表示一个有序的集合(也称为序列)。与Set不同,List允许存储重复的元素,并且每个元素都有其特定的位置。List接口在java.util包中定义,是Collection接口的子接口。

List的主要特点:

  • 有序性:List中的元素是有序的,可以通过索引(位置)来访问元素。
  • 可重复性:List允许存储重复的元素。
  • 动态性:List的大小是可变的,可以在运行时添加或删除元素。

List的常用实现类:

  • ArrayList:基于动态数组实现的List,随机访问元素速度快,但在列表中间插入或删除元素时性能较差。
  • LinkedList:基于链表实现的List,在列表中间插入或删除元素时性能较好,但随机访问元素速度较慢。
  • Vector:是线程安全的ArrayList,但性能较低,通常不推荐使用,除非需要线程安全。
  • Stack:继承自Vector,实现了一个后进先出(LIFO)的栈结构。

List的常用方法:

添加元素:

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

删除元素:

  • boolean remove(Object o):从此列表中移除指定元素的第一个匹配项(如果存在)。
  • E remove(int index):移除列表中指定位置的元素。
  • boolean removeAll(Collection<?> c):从此列表中移除指定集合中包含的所有元素。
  • boolean retainAll(Collection<?> c):仅保留此列表中那些也包含在指定集合中的元素。
  • void clear():移除此列表中的所有元素。

获取元素:

  • E get(int index):返回列表中指定位置的元素。
  • int indexOf(Object o):返回此列表中首次出现指定元素的索引;如果此列表不包含元素,则返回 -1。
  • int lastIndexOf(Object o):返回此列表中最后出现指定元素的索引;如果此列表不包含元素,则返回 -1。
  • List subList(int fromIndex, int toIndex):返回列表中指定的 fromIndex(包括)和
    toIndex(不包括)之间的部分视图。

其他常用方法:

  • boolean isEmpty():如果此列表不包含元素,则返回 true。
  • int size():返回此列表中的元素数。
  • boolean contains(Object o):如果此列表包含指定的元素,则返回 true。
  • Iterator iterator():返回按适当顺序在此列表的元素上进行迭代的迭代器。
  • List sort(Comparator<? super E> c):根据指定的比较器对此列表进行排序。

使用示例:

java">import java.util.ArrayList;  
import java.util.List;  public class ListExample {  public static void main(String[] args) {  List<String> list = new ArrayList<>();  // 添加元素  list.add("Apple");  list.add("Banana");  list.add("Cherry");  // 访问元素  System.out.println(list.get(1)); // 输出: Banana  // 修改元素  list.set(1, "Blueberry");  System.out.println(list.get(1)); // 输出: Blueberry  // 删除元素  list.remove("Cherry");  System.out.println(list); // 输出: [Apple, Blueberry]  // 遍历元素  for (String fruit : list) {  System.out.println(fruit);  }  // 检查元素是否存在  System.out.println(list.contains("Apple")); // 输出: true  // 获取列表大小System.out.println(list.size()); // 输出: 2// 对列表进行排序(假设元素实现了Comparable接口)  List<Integer> numbers = new ArrayList<>();  numbers.add(3);  numbers.add(1);  numbers.add(2);  numbers.sort(null); // 使用自然顺序排序  System.out.println(numbers); // 输出: [1, 2, 3]  // 使用子列表  List<String> subList = list.subList(0, 1); // 获取从索引0到索引1(不包括)的子列表  System.out.println(subList); // 输出: [Apple]  
}

性能考虑:

选择哪种List实现取决于具体的使用场景。如果需要频繁地在列表中间进行插入或删除操作,LinkedList可能是更好的选择。如果需要频繁地访问列表中的元素(例如通过索引访问),那么ArrayList可能更合适。然而,在大多数情况下,ArrayList的性能表现通常优于LinkedList,特别是在处理大量数据时。因此,除非有特定的性能需求,否则ArrayList通常是更好的默认选择。

线程安全:

List接口本身并不保证线程安全。如果多个线程同时修改List,可能会导致数据不一致或其他并发问题。如果需要线程安全的List,可以使用Collections.synchronizedList()方法包装一个List,或者使用CopyOnWriteArrayList等线程安全的List实现类。

总结:

Java的List是一个功能强大的集合类型,它提供了许多用于操作有序元素集合的方法。选择正确的List实现类以及正确地使用这些方法对于编写高效且可靠的Java代码至关重要。通过理解List的主要特点、常用实现类、常用方法以及性能考虑,可以更好地利用Java的集合框架来构建复杂的数据结构和算法。


http://www.ppmy.cn/devtools/4182.html

相关文章

Docker 学习笔记(八):Dockerfile实战篇,制作 Tomcat 镜像,发布镜像到 DockerHub 和阿里云

一、前言 记录时间 [2024-4-13] 系列文章简摘&#xff1a; Docker 学习笔记&#xff08;六&#xff09;&#xff1a;挑战容器数据卷技术一文通&#xff0c;实战多个 MySQL 数据同步&#xff0c;能懂会用&#xff0c;初学必备 Docker 学习笔记&#xff08;七&#xff09;&#x…

学习 Rust 的第七天:如何理解引用

大家好&#xff0c; 今天是我学 Rust 的第7天&#xff0c;今天我要来看一下引用和借用。昨天我学习了 Rust 的所有权模型&#xff0c;如果你对 Rust 一无所知的话&#xff0c;那篇文章是必读的。 引用 昨天我们看到&#xff0c;将参数传递给函数与将值赋给另一个变量产生了相…

【C语言】指针详解(五)

目录 1.字符指针 1.1常量字符串 2.指针数组 3.数组指针 1.字符指针 字符指针就是指向字符的指针&#xff0c;字符指针可以存储字符变量的地址。 举例如下&#xff1a; 定义指针变量pa存a的地址&#xff0c;改变*pa的值&#xff0c;a也会随之改变 。 1.1常量字符串 &#x1f…

C# WPF故障记录

1&#xff0c;ComboBox初始更新问题 问题描述:初始化时&#xff0c;设置了SelectIndex,但是尚未正常显示 解决办法&#xff1a;IsEditable"False" 2&#xff0c;Window中创建的Task无法正常退出问题 问题描述:在Window界面文件中添加了Task&#xff0c;但是关闭窗…

【STL详解 —— list的介绍及使用】

STL详解 —— list的介绍及使用 list的介绍list的介绍使用list的构造list iterator的使用list capacitylist element accesslist modifiers 示例list的迭代器失效 list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭…

C语言转型之路:从C到C++的类与对象初探

欢迎来CILMY23的博客 本篇主题为 C语言转型之路&#xff1a;从C到C的类与对象初探 个人主页&#xff1a;CILMY23-CSDN博客 个人专栏系列&#xff1a; Python | C语言 | 数据结构与算法 | C 感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 写在前头…

JVM(Java虚拟机)内存管理基础理论

JVM&#xff08;Java虚拟机&#xff09;内存管理是Java开发和性能优化中的一个核心领域。理解JVM的内存结构和管理机制对于编写高效的Java程序和进行有效的性能调优非常重要。以下是一个关于JVM内存学习的大纲&#xff0c;涵盖了从基础知识到高级主题的各个方面&#xff1a; 1.…

【御控物联】物联网数据传输数据格式

随着物联网技术的快速发展&#xff0c;越来越多的系统和设备被接入到了物联网管理中&#xff0c;数据交换与共享成为了一个重要的问题。不同的设备和系统之间存在着各种各样的通信协议和数据格式&#xff0c;这就给数据获取、交换和共享带来了很大的不便利。 MQTT 是机器对机器…