跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Java List 使用举例(从入门到精通)

目录

一、List 基础概念

1.1 什么是 List?

1.2 List 的核心特性1.3 List 家族成员

二、List 基本操作

2.1 创建 List 的三种方式2.2 添加元素 - 丰富你的书架2.3 访问元素 - 查找书籍2.4 修改元素 - 替换书籍2.5 删除元素 - 清理书架

三、遍历 List 的多种方式

3.1 基础遍历方法3.2 使用迭代器3.3 Java 8+ 高级遍历3.4 遍历性能对比

四、List 高级操作

4.1 排序操作4.2 过滤与转换4.3 数学统计4.4 列表转换

五、ArrayList 深度解析

5.1 内部结构5.2 扩容机制5.3 性能特点

六、LinkedList 深度解析

6.1 内部结构6.2 操作原理6.3 性能对比 ArrayList

七、实战应用案例

7.1 学生成绩管理系统7.2 购物车实现

八、最佳实践与性能优化

8.1 选择正确的 List 实现8.2 性能优化技巧

九、常见问题与解决方案 (30分钟)

ConcurrentModificationException性能陷阱:LinkedList的随机访问对象相等性判断

十、总结与进阶学习

List 知识体系总结

一、List 基础概念

1.1 什么是 List?

List 就像是一个智能书架:可以按顺序存放书籍(元素)

每本书都有固定位置(索引)

可以随时添加、取出或重新排列书籍// 创建一个书架(List)

List bookshelf = new ArrayList<>();1.2 List 的核心特性特性说明生活类比有序性元素按添加顺序存储书架上的书按放入顺序排列可重复允许相同元素多次出现同一本书可以有多个副本索引访问通过位置编号快速获取元素通过书架编号找书动态扩容自动调整存储空间智能书架自动扩展1.3 List 家族成员

二、List 基本操作

2.1 创建 List 的三种方式// 方式1:标准创建(推荐)

List fruits = new ArrayList<>();// 方式2:快速初始化List numbers = Arrays.asList(1, 2, 3, 4, 5);// 方式3:不可变列表(Java 9+)

List colors = List.of("红", "绿", "蓝");2.2 添加元素 - 丰富你的书架fruits.add("苹果"); // 末尾添加fruits.add(0, "香蕉"); // 指定位置插入fruits.addAll(Arrays.asList("橙子", "葡萄")); // 批量添加System.out.println(fruits);// 输出: [香蕉, 苹果, 橙子, 葡萄]2.3 访问元素 - 查找书籍// 获取单个元素String firstFruit = fruits.get(0); // "香蕉"// 检查元素是否存在boolean hasApple = fruits.contains("苹果"); // true// 查找元素位置int appleIndex = fruits.indexOf("苹果"); // 12.4 修改元素 - 替换书籍// 替换指定位置的元素String oldFruit = fruits.set(1, "青苹果");System.out.println("被替换的水果: " + oldFruit); // "苹果"2.5 删除元素 - 清理书架// 按索引删除String removed = fruits.remove(0); // 删除"香蕉"// 按元素值删除boolean isRemoved = fruits.remove("葡萄"); // true// 批量删除fruits.removeAll(Arrays.asList("橙子", "青苹果"));// 清空书架fruits.clear();

三、遍历 List 的多种方式

3.1 基础遍历方法// 1. for循环(索引访问)

for (int i = 0; i < fruits.size(); i++) {System.out.println((i+1) + ". " + fruits.get(i));}// 2. 增强for循环for (String fruit : fruits) {System.out.println(fruit);}3.2 使用迭代器// 3. Iterator遍历Iterator iterator = fruits.iterator();while (iterator.hasNext()) {String fruit = iterator.next();if (fruit.equals("葡萄")) {iterator.remove(); // 安全删除}}3.3 Java 8+ 高级遍历// 4. forEach方法fruits.forEach(fruit -> System.out.println(fruit));// 5. 方法引用fruits.forEach(System.out::println);// 6. 并行流遍历(大数据量)

fruits.parallelStream().forEach(fruit -> {// 并行处理逻辑});3.4 遍历性能对比遍历方式10万元素耗时适用场景for循环5ms需要索引时增强for 7ms简单遍历Iterator 8ms需要删除元素时forEach 10ms函数式编程并行流3ms大数据量处理

四、List 高级操作

4.1 排序操作List numbers = Arrays.asList(5, 2, 9, 1, 3);// 自然排序(升序)

Collections.sort(numbers);// 输出: [1, 2, 3, 5, 9]// 自定义排序(降序)

numbers.sort((a, b) -> b - a);// 输出: [9, 5, 3, 2, 1]// 对象排序List books = new ArrayList<>();books.add(new Book("Java编程", 99));books.add(new Book("Python入门", 69));books.sort(Comparator.comparing(Book::getPrice));4.2 过滤与转换// 过滤高价水果List expensiveFruits = fruits.stream().filter(fruit -> fruit.length() > 2).collect(Collectors.toList());// 水果名称转大写List upperCaseFruits = fruits.stream().map(String::toUpperCase).collect(Collectors.toList());4.3 数学统计IntSummaryStatistics stats = numbers.stream().mapToInt(Integer::intValue).summaryStatistics();System.out.println("最大值: " + stats.getMax());System.out.println("最小值: " + stats.getMin());System.out.println("平均值: " + stats.getAverage());System.out.println("总数: " + stats.getSum());4.4 列表转换// List转数组String[] fruitArray = fruits.toArray(new String[0]);// 数组转List(不可修改)

List fixedList = Arrays.asList(fruitArray);// 数组转List(可修改)

List modifiableList = new ArrayList<>(Arrays.asList(fruitArray));

五、ArrayList 深度解析

5.1 内部结构ArrayList 就像是一个智能伸缩书架:// 简化版ArrayList实现public class SimpleArrayList {private Object[] elements; // 存储元素的数组private int size; // 当前元素数量public SimpleArrayList() {this.elements = new Object[10]; // 初始容量}public void add(E element) {// 当数组满时自动扩容if (size == elements.length) {Object[] newArray = new Object[elements.length * 2];System.arraycopy(elements, 0, newArray, 0, size);elements = newArray;}elements[size++] = element;}}5.2 扩容机制

5.3 性能特点操作时间复杂度说明get(index) O(1)直接通过索引访问add(element) O(1)平均时间复杂度add(index, element) O(n)需要移动后续元素remove(index) O(n)需要移动后续元素contains(element) O(n)需要遍历查找

六、LinkedList 深度解析

6.1 内部结构LinkedList 就像是一个带前后指针的书本链:// 简化版链表节点class Node {E item; // 当前元素Node next; // 下一个节点Node prev; // 上一个节点Node(Node prev, E element, Node next) {this.item = element;this.next = next;this.prev = prev;}}6.2 操作原理// 在指定位置插入元素public void add(int index, E element) {// 1. 找到目标位置的节点Node target = getNode(index);// 2. 创建新节点Node newNode = new Node<>(target.prev, element, target);// 3. 调整前后节点指针target.prev.next = newNode;target.prev = newNode;}6.3 性能对比 ArrayList操作ArrayList LinkedList适用场景随机访问⚡️ 快 (O(1))🐢 慢 (O(n))需要频繁按索引访问头部插入🐢 慢 (O(n))⚡️ 快 (O(1))需要频繁在开头添加尾部插入⚡️ 快 (O(1))⚡️ 快 (O(1))在末尾添加中间插入🐢 慢 (O(n))⚡️ 快 (O(1))需要频繁在中间插入内存占用较少(仅需存储元素)

较多(每个元素需要额外指针)

内存敏感场景

七、实战应用案例

7.1 学生成绩管理系统class Student {private String name;private int score;// 构造方法、getter/setter省略}public class GradeSystem {private List students = new ArrayList<>();// 添加学生public void addStudent(Student student) {students.add(student);}// 按分数排序public void sortByScore() {students.sort(Comparator.comparingInt(Student::getScore).reversed());}// 查找前N名学生public List getTopStudents(int n) {return students.stream().sorted(Comparator.comparingInt(Student::getScore).reversed()).limit(n).collect(Collectors.toList());}// 统计分数分布public Map getScoreDistribution() {return students.stream().collect(Collectors.groupingBy(s -> {int score = s.getScore();if (score >= 90) return "优秀";if (score >= 80) return "良好";if (score >= 60) return "及格";return "不及格";},Collectors.counting()));}}7.2 购物车实现class CartItem {private String productId;private String name;private double price;private int quantity;// 构造方法、getter/setter省略}public class ShoppingCart {private List items = new LinkedList<>();// 添加商品public void addItem(CartItem newItem) {// 检查是否已存在for (CartItem item : items) {if (item.getProductId().equals(newItem.getProductId())) {item.setQuantity(item.getQuantity() + newItem.getQuantity());return;}}items.add(newItem);}// 更新数量public void updateQuantity(String productId, int newQuantity) {items.removeIf(item -> item.getProductId().equals(productId));if (newQuantity > 0) {items.add(new CartItem(productId, newQuantity));}}// 计算总价public double calculateTotal() {return items.stream().mapToDouble(item -> item.getPrice() * item.getQuantity()).sum();}// 生成订单public Order checkout() {Order order = new Order();order.setItems(new ArrayList<>(items));order.setTotal(calculateTotal());items.clear();return order;}}

八、最佳实践与性能优化

8.1 选择正确的 List 实现场景推荐实现理由读多写少ArrayList随机访问快频繁增删LinkedList插入删除快多线程环境CopyOnWriteArrayList线程安全固定大小列表Arrays.asList()内存优化不可变列表List.of()安全简洁8.2 性能优化技巧预分配容量(减少扩容开销)

// 预计存储1000个元素List largeList = new ArrayList<>(1000);批量操作(减少方法调用)

// 差: 多次调用add for (String item : items) {list.add(item);}// 好: 批量添加list.addAll(items);避免在循环中调用size// 差: 每次循环都调用size() for (int i = 0; i < list.size(); i++) {// ...

}// 好: 缓存size值int size = list.size();for (int i = 0; i < size; i++) {// ...

}使用subList视图// 创建子列表视图(不复制数据)

List sub = list.subList(0, 5);

九、常见问题与解决方案 (30分钟)

ConcurrentModificationException问题:遍历时修改集合List list = new ArrayList<>(Arrays.asList("A", "B", "C"));for (String s : list) {if ("B".equals(s)) {list.remove(s); // 抛出异常}}解决方案:// 1. 使用Iterator的remove方法Iterator it = list.iterator();while (it.hasNext()) {String s = it.next();if ("B".equals(s)) {it.remove(); // 安全删除}}// 2. 使用Java 8+ removeIf list.removeIf("B"::equals);// 3. 创建副本遍历new ArrayList<>(list).forEach(s -> {if ("B".equals(s)) {list.remove(s);}});性能陷阱:LinkedList的随机访问问题:LinkedList list = new LinkedList<>();// 填充数据...

// 随机访问性能差for (int i = 0; i < list.size(); i++) {Integer value = list.get(i); // O(n)操作}解决方案// 1. 使用迭代器Iterator it = list.iterator();while (it.hasNext()) {Integer value = it.next();}// 2. 使用增强for循环for (Integer value : list) {// ...

}// 3. 转换为ArrayList(只读场景)

List arrayList = new ArrayList<>(list);对象相等性判断问题:自定义对象在List中的行为解决方案:class Person {String name;@Override public boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return Objects.equals(name, person.name);}@Override public int hashCode() {return Objects.hash(name);}}

十、总结与进阶学习

List 知识体系总结

到此这篇关于Java List 使用详解:从入门到精通的文章就介绍到这了,更多相关Java List 使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:Java中List的contains()方法的使用小结使用Java获取List交集数据的实现方案小结使用Java找出两个List中的重复元素三种方法详解Java List中五种常见实现类的使用java中list使用时需避免的场景总结Java中List使用stream流转成map的几种方式详解浅析java中asList的使用详解Java List接口的集合使用详解

相关文章