列表

Java 的数据类型与异常

Jim White

Java Developer

List 接口

  • List 接口,Collection 的子接口
    • 定义有序的对象组
    • 可包含重复对象
  • List 的多种实现
    • 行为相近
    • 实现决定底层如何管理对象
Java 的数据类型与异常

List 的实现

  • ArrayList —— 可调整大小、按索引(类似数组)、有序的对象列表

ArrayList 类似具有索引元素的 Java 数组

  • LinkedList —— 对象通过指向前后元素的链接相连。

LinkedList 是由指针连接的对象列表

  • 无论实现如何,增删改对象的方式相同
1 参见 https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/List.html 获取 List 类型与详情
Java 的数据类型与异常

ArrayList

  • 使用 new 构造实例,并用泛型指定内容类型
  • .add(object) 向末尾添加对象
  • .get(index) 访问对象
    • ArrayList 使用从 0 开始的索引
  • .set(index, object) 替换/修改对象
  • .remove(index) 删除对象
  • .clear() 清空所有对象
  • .size() 获取数量
import java.util.ArrayList;
...
ArrayList<String> animals
  = new ArrayList<String>();

animals.add("horse"); animals.add("cow"); animals.add("horse"); // 允许重复
String c = animals.get(1); // c="cow" animals.set(1, "chicken");
// 移除第一个 horse animals.remove(0); // 移除所有对象 animals.clear();
animals.size();
Java 的数据类型与异常

对象与基本类型

  • 使用包装类将基本类型添加到任意集合框架对象
  • 添加的基本类型会"自动装箱"
    • 自动装箱:自动将基本类型放入其包装类的过程
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(new Integer(5));
list.add(6);  // 6 会被 Integer 自动包装后添加
  • 自动装箱适用于所有集合框架对象
Java 的数据类型与异常

异构集合

  • 集合框架的数据结构可为异构
    • 异构 = 可包含不同类型的对象
    • 将参数化类型设为 Object
ArrayList<Object> list = new ArrayList<Object>(); // 允许任意对象
list.add(new Integer(5)); // 添加一个 Integer
list.add(6); // 通过自动装箱添加 Integer
list.add("Hello"); // 添加一个 String
Java 的数据类型与异常

遍历 List

  • 使用"for-each"语法遍历 List 的对象
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");

for (String animal : animals) { // for-each 遍历整个 ArrayList
    System.out.println(animal);
}
horse
cow
chicken
Java 的数据类型与异常

List 的 println

  • List 实例(如 ArrayList)的内容可用 println 显示
ArrayList<String> animals = new ArrayList<String>();
animals.add("horse");
animals.add("cow");
animals.add("chicken");
System.out.println(animals);  // 显示 ArrayList 中的所有元素

ArrayList<Object> list = new ArrayList<Object>();
list.add(5);
list.add("Hello");
System.out.println(list);  // 显示 ArrayList 中的所有元素
[horse, cow, chicken]
[5, Hello]
Java 的数据类型与异常

LinkedList

  • LinkedList 的构造方式与 ArrayList 相同
  • LinkedList 拥有与 ArrayList 相同的方法
import java.util.LinkedList;
...
LinkedList<String> cars // 创建一个新的 …
  = new LinkedList<String>(); // … LinkedList
cars.add("Ford"); // 向列表添加对象
cars.add("Mercedes");
String c = cars.get(1);
cars.set(1, "Toyota"); // 替换对象
System.out.println(cars); // 显示列表
cars.remove(0); // 移除对象
cars.clear();  // 移除所有对象
cars.size(); // 获取列表长度
[Ford, Toyota]
Java 的数据类型与异常

LinkedList 附加方法

  • 一些附加方法
    • addFirst() 添加到开头
    • addLast() 添加到末尾
    • removeFirst() 从开头移除
    • removeLast() 从末尾移除
cars.addFirst("Fiat"); // 添加到开头
cars.addLast("BMW"); // 添加到末尾
cars.removeFirst(); // 移除第一个对象
cars.removeLast(); // 移除最后一个对象
Java 的数据类型与异常

集合类型的相似性

  • ArrayListLinkedList 看起来相似
    • 集合框架中的其他类型也有相似之处
    • 这是有意设计
  • 它们共享接口:List
    • 多态性的示例("多种形式")
Java 的数据类型与异常

ArrayList vs LinkedList

  • ArrayListLinkedList(或任意 List)的操作相同
    • 选择哪种 List 取决于用途
  • ArrayList 注意点:
    • 随机访问快(如:list.get(11)
    • 在中间添加/删除较慢
    • 因为插入/删除时对象需物理移动

在 ArrayList 中间添加对象需要大量移动

Java 的数据类型与异常

ArrayList vs LinkedList

  • LinkedList 注意点:
    • 随机访问较慢(如:list.get(11)
    • 在中间添加/删除更快。
    • 因为不需物理移动对象,只改几个引用

在 LinkedList 中间添加对象只需更改一些指针

Java 的数据类型与异常

Passons à la pratique !

Java 的数据类型与异常

Preparing Video For Download...