List与ArrayList

ArrayList是最常用的集合,本课学习List的详细用法。

ArrayList

ArrayList是基于数组实现的动态数组。

特点

特点 说明
有序 元素按插入顺序排列
可重复 可以有相同元素
索引访问 通过索引访问元素
动态增长 自动扩容

创建ArrayList

JAVA
import java.util.ArrayList;
import java.util.List;

// 方式1:默认容量
List<String> list1 = new ArrayList<>();

// 方式2:指定容量
List<String> list2 = new ArrayList<>(100);

// 方式3:从其他集合创建
List<String> list3 = new ArrayList<>(list1);

基本操作

添加元素

JAVA
List<String> list = new ArrayList<>();

list.add("Alice");        // 添加到末尾
list.add("Bob");
list.add(0, "Charlie");   // 添加到指定位置

System.out.println(list);  // [Charlie, Alice, Bob]

获取元素

JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");

String first = list.get(0);  // Alice
int size = list.size();       // 2

修改元素

JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");

list.set(0, "Charlie");  // 把第一个元素改为Charlie
System.out.println(list);  // [Charlie, Bob]

删除元素

JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
list.add("Charlie");

list.remove(0);           // 按索引删除
list.remove("Bob");       // 按内容删除
System.out.println(list);  // [Charlie]

查找元素

JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
list.add("Charlie");

boolean has = list.contains("Bob");    // true
int index = list.indexOf("Charlie");   // 2
int lastIndex = list.lastIndexOf("Alice");  // 0

遍历方式

方式1:for循环

JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
list.add("Charlie");

for (int i = 0; i < list.size(); i++) {
    System.out.println(i + ": " + list.get(i));
}

方式2:for-each

JAVA
for (String name : list) {
    System.out.println(name);
}

方式3:Iterator

JAVA
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}

方式4:Lambda

JAVA
list.forEach(name -> System.out.println(name));
list.forEach(System.out::println);

排序

使用Collections.sort()

JAVA
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

List<Integer> numbers = new ArrayList<>();
numbers.add(3);
numbers.add(1);
numbers.add(4);
numbers.add(1);
numbers.add(5);

Collections.sort(numbers);  // 升序
System.out.println(numbers);  // [1, 1, 3, 4, 5]

Collections.sort(numbers, Collections.reverseOrder());  // 降序
System.out.println(numbers);  // [5, 4, 3, 1, 1]

使用Comparator

JAVA
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

List<String> names = new ArrayList<>();
names.add("Charlie");
names.add("Alice");
names.add("Bob");

// 按字母顺序
names.sort((a, b) -> a.compareTo(b));
System.out.println(names);  // [Alice, Bob, Charlie]

// 按长度
names.sort(Comparator.comparingInt(String::length));
System.out.println(names);  // [Bob, Alice, Charlie]

其他常用方法

方法 说明
addAll(Collection) 添加所有元素
removeAll(Collection) 删除所有匹配元素
retainAll(Collection) 保留交集
clear() 清空
isEmpty() 是否为空
toArray() 转数组
subList(int, int) 截取子列表

示例:批量操作

JAVA
List<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");

List<String> list2 = new ArrayList<>();
list2.add("B");
list2.add("C");
list2.add("D");

// 并集
List<String> union = new ArrayList<>(list1);
union.addAll(list2);
System.out.println("并集:" + union);  // [A, B, C, B, C, D]

// 交集
List<String> intersection = new ArrayList<>(list1);
intersection.retainAll(list2);
System.out.println("交集:" + intersection);  // [B, C]

// 差集
List<String> diff = new ArrayList<>(list1);
diff.removeAll(list2);
System.out.println("差集:" + diff);  // [A]
▶ 试一试

LinkedList

LinkedList是基于双向链表实现的List。

特点

特点 ArrayList LinkedList
底层结构 数组 双向链表
随机访问 O(1) O(n)
头部插入 O(n) O(1)
尾部插入 O(1) O(1)
内存占用 较少 较多(指针)

LinkedList特有方法

JAVA
LinkedList<String> linkedList = new LinkedList<>();

// 头尾操作
linkedList.addFirst("A");
linkedList.addLast("B");
linkedList.addLast("C");

String first = linkedList.getFirst();
String last = linkedList.getLast();

linkedList.removeFirst();
linkedList.removeLast();

选择建议

场景 推荐
频繁随机访问 ArrayList
频繁头部插入/删除 LinkedList
一般场景 ArrayList

示例:学生成绩管理

JAVA
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class StudentGrade {
    private String name;
    private int score;
    
    public StudentGrade(String name, int score) {
        this.name = name;
        this.score = score;
    }
    
    public String getName() { return name; }
    public int getScore() { return score; }
    
    @Override
    public String toString() {
        return name + ": " + score;
    }
    
    public static void main(String[] args) {
        List<StudentGrade> students = new ArrayList<>();
        students.add(new StudentGrade("Alice", 95));
        students.add(new StudentGrade("Bob", 88));
        students.add(new StudentGrade("Charlie", 92));
        students.add(new StudentGrade("David", 85));
        
        // 按成绩降序
        students.sort((a, b) -> b.getScore() - a.getScore());
        System.out.println("按成绩排序:");
        students.forEach(System.out::println);
        
        // 找最高分
        StudentGrade top = students.stream()
            .max(Comparator.comparingInt(StudentGrade::getScore))
            .orElse(null);
        System.out.println("最高分:" + top);
        
        // 计算平均分
        double avg = students.stream()
            .mapToInt(StudentGrade::getScore)
            .average()
            .orElse(0);
        System.out.printf("平均分:%.1f%n", avg);
    }
}

❓ 常见问题

Q ArrayList初始容量是多少?
A 默认10。如果知道大概数量,可以在构造方法中指定,减少扩容次数。
Q ArrayList扩容机制是什么?
A 每次扩容为原来的1.5倍。
Q List可以存储null吗?
A ArrayList和LinkedList都可以存储null。

📖 小节

📝 作业

  1. 去重: 将ArrayList中的重复元素去除
  2. 合并: 合并两个有序List为一个有序List
  3. 统计: 统计List中每个元素出现的次数

下一课

下一课我们将学习 Set与HashSet,了解Set的去重原理。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏