跳转到主要内容
模块 4 · 第 2 课(共 2)课程中的8/14~15 min
模块课程(2/2)

集合和ArrayList

Java 中的传统数组在创建时定义了固定大小。为了处理大小可以动态变化的数据列表,Java 提供了 Java Collections Framework。最常用的类是 ArrayList。

ArrayList 类和泛型

ArrayList 在内存中实现可调整大小的数组。要声明 ArrayList,我们必须将其包含在尖括号 < > 中来指定它将包含的元素类型。此功能称为泛型。

要使用 ArrayList,我们必须在文件开头从 java.util.ArrayList 导入它。

声明和实例化:

Java
import java.util.ArrayList;

ArrayList<String> shoppingList = new ArrayList<>();

核心方法

以下是 ArrayList 上的基本操作:

  1. add(element):将一个元素添加到列表末尾。
  2. get(index):返回指定索引处的元素(从 0 开始索引)。
  3. size():返回列表中当前元素的数量。
  4. remove(index):删除指定索引处的元素。
Java
shoppingList.add("Pane");
shoppingList.add("Latte");

System.out.println("Elementi: " + shoppingList.size()); // Prints 2
System.out.println("Primo elemento: " + shoppingList.get(0)); // Prints "Pane"

迭代列表(For-Each)

for-each 循环是迭代集合中所有元素的理想结构:

Java
for (String item : shoppingList) {
    System.out.println(item);
}

Array 与 ArrayList:内存和性能

尽管 ArrayList 比静态数组灵活得多,但它会带来性能和内存的权衡:

  • 静态数组:它分配在连续的内存块中,具有固定的大小,并且通过索引访问元素非常快。它直接存储原始类型,没有开销。
  • ArrayList:在内部,它管理一个在超出其初始容量(通常为 10)时调整大小的数组(通过创建一个新的更大数组并复制旧元素)。此外,它只存储对象引用,从而为每个元素引入内存开销。

自动装箱和拆箱

由于 ArrayList 只能保存对象,因此 Java 会自动执行基本类型与其各自的包装类之间的转换:

  • 自动装箱:从原始类型自动转换为包装类。例如,当您编写 numbers.add(42) 时,Java 会自动将 42 (int) 转换为 Integer.valueOf(42) (Integer)。
  • 拆箱:从包装类到原始类型的自动转换。例如,当您执行 int num = numbers.get(0) 时,Java 在内部将 Integer 转换为 int。

自己尝试一下

锻炼#java.m4.l2.e1
尝试:0加载中...

导入ArrayList,声明一个名为names的String ArrayList。将 Alice 和 Bob 添加到列表中,然后使用 size() 方法打印其大小。

正在加载编辑器...
显示提示

在顶部包含“import java.util.ArrayList;”。使用“ArrayList <String>名称= new ArrayList <>();”创建列表,添加元素,并使用“names.size()”打印其大小。

3 次尝试后可用的解决方案

锻炼#java.m4.l2.e2
尝试:0加载中...

声明一个名为 Numbers 的 Integer ArrayList,添加数字 42,然后使用 get() 在索引 0 处检索它来打印它。

正在加载编辑器...
显示提示

使用 `ArrayList<Integer>numbers = new ArrayList<>();`(使用 Integer 包装类)并使用 `System.out.println(numbers.get(0));` 打印它。

3 次尝试后可用的解决方案

锻炼#java.m4.l2.e3
尝试:0加载中...

声明一个名为颜色的字符串数组列表。将颜色“红色”、“绿色”和“蓝色”添加到列表中。最后,使用 for-each 循环迭代列表并将每种颜色打印到屏幕上。

正在加载编辑器...
显示提示

使用“ArrayList<String> color = new ArrayList<>();”声明列表,添加三种颜色,并使用循环“for (String c : color)”使用“System.out.println(c);”打印它们。

3 次尝试后可用的解决方案