在 Java 集合框架中,List 是一个非常重要的接口,它继承自 Collection,提供了对有序集合的支持。List 集合允许重复元素,并且可以通过索引访问元素,这使得它在很多场景中非常有用。
一、List 接口简介
List 接口表示一个有序的集合,集合中的元素可以通过索引访问。与 Set 不同,List 允许重复的元素。List 是一种线性的数据结构,适合在需要保持元素顺序的场景下使用。List 接口常见的实现类有 ArrayList、LinkedList 和 Vector。
二、List 接口的独有方法
List 接口在继承 Collection 接口的基础上,增加了许多独有的方法,用于操作集合中的元素。这些方法包括:
- void add(int index, E element) :在指定位置插入元素,原位置及其后的元素向后移动。
- E remove(int index) :删除指定索引位置的元素,并返回被删除的元素。
- E set(int index, E element) :用新元素替换指定索引位置的元素,返回旧元素。
- E get(int index) :返回指定索引位置的元素。
示例代码
import java.util.ArrayList;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
// 在索引1位置插入元素
list.add(1, "QQQ");
System.out.println(list); // 输出: [aaa, QQQ, bbb, ccc]
// 删除索引0位置的元素
//调用方法的时候,如果方法出现了重载现象
//优先调用,实参跟形参类型一致的那个方法。
String removedElement = list.remove(0);
System.out.println(removedElement); // 输出: aaa
System.out.println(list); // 输出: [QQQ, bbb, ccc]
// 修改索引1位置的元素
String oldElement = list.set(1, "DDD");
System.out.println(oldElement); // 输出: bbb
System.out.println(list); // 输出: [QQQ, DDD, ccc]
// 获取索引1位置的元素
String element = list.get(1);
System.out.println(element); // 输出: DDD
}
}
三、List 接口的五种遍历方式
遍历 List 是一个非常常见的操作,根据具体需求和场景,有多种方式可以选择。以下是五种常见的遍历方法:
1. 使用 Iterator 遍历
Iterator 是一种通用的遍历集合的方式。它提供了 hasNext() 和 next() 方法,用于检查是否有下一个元素和获取下一个元素。Iterator 还提供了 remove() 方法,可以安全地在遍历过程中删除元素。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String element = it.next();
System.out.println(element);
}
}
}
2. 使用 ListIterator 遍历
ListIterator 是 Iterator 的增强版本,它不仅可以向前遍历,还可以向后遍历,并且可以在遍历过程中修改列表。ListIterator 提供了 hasPrevious() 和 previous() 方法。
- hasPrevious():如果以逆向遍历列表,列表迭代器前面还有元素,则返回 true,否则返回false
- previous():返回列表中ListIterator指向位置前面的元素
- 获取一个列表迭代器的对象,里面的指针默认也是指向0索引的
- 额外添加了一个 add() 方法:在遍历的过程中,可以添加元素
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
ListIterator<String> it = list.listIterator();
while (it.hasNext()) {
String element = it.next();
System.out.println(element);
if("bbb".equals(str)){
//添加元素
it.add("qqq");
}
}
// 逆向遍历
while (it.hasPrevious()) {
String element = it.previous();
System.out.println(element);
}
}
}
3. 使用增强 for 循环
增强 for 循环是一种简洁的遍历集合的方式,不需要显式地使用索引或迭代器。它适用于只读操作,不支持在遍历过程中修改集合。
- 下面的变量element,其实就是一个第三方的变量而已。
- 在循环的过程中,依次表示集合中的每一个元素
import java.util.ArrayList;
import java.util.List;
public class ForEachDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
for (String element : list) {
System.out.println(element);
}
}
}
4. 使用 Lambda 表达式遍历
Java 8 引入了 forEach 方法和 Lambda 表达式,使得遍历集合更加简洁和直观。forEach 方法接收一个 Consumer 接口的实现,可以使用 Lambda 表达式来处理每个元素。
- forEach方法的底层其实就是一个循环遍历,依次得到集合中的每一个元素
- 并把每一个元素传递给下面的accept方法
- accept方法的形参element,依次表示集合中的每一个元素
import java.util.ArrayList;
import java.util.List;
public class LambdaDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.forEach(element -> System.out.println(element));
}
}
5. 使用普通 for 循环遍历
传统的 for 循环可以通过索引访问 List 中的每个元素。这种方式适合需要对索引进行操作或访问特定范围元素的场景。
import java.util.ArrayList;
import java.util.List;
public class ForLoopDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
for (int i = 0; i < list.size(); i++) {
String element = list.get(i);
System.out.println(element);
}
}
}
四、总结
List 接口是 Java 集合框架中至关重要的一部分,为开发者提供了处理有序集合的强大功能。通过各种方法和遍历方式,List 可以高效地操作和管理数据。本文详细介绍了 List 的四个独有方法和五种遍历方式,希望能够帮助开发者更好地理解和使用 List。掌握这些技巧后,开发者可以在实际项目中更加灵活地处理和操作数据集合。