Java 中的 ArrayList
创建名为 tags 的 ArrayList<String>,调用 tags.add("oak");,再调用 tags.add("pine");,并用 System.out.println(tags); 打印列表。编译 Shelf.java 并运行 java Shelf。屏幕应显示一行:[oak, pine]。方括号和逗号属于 Java 打印列表的方式。你用 add 让列表增长。导入之后这份会增长的列表,就是本页要教的内容。
可以增长的列表
在数组页里,String[] 用花括号保存固定数量的格子。你不能对那个数组调用 add。ArrayList 是另一种容器。你先创建空列表,再用 add 推进值。每次 add 让列表多一个元素。打印行把当前保存的所有值显示在方括号里,用逗号和空格分开。
打开 Shelf.java。保留公共类名 Shelf,使它与文件名一致。删除上一页残留的 import kit.Bell;、Bell.ring();、package kit;,以及任何 Porch 或 Lobby 调用。那些属于 Classes 模块的故事。本页打开 Collections。也删除任何 Scanner、nextLine 或键盘读取。程序不应等待你输入。
靠近 Shelf.java 顶部、在 public class Shelf 之上写:
import java.util.ArrayList;
这行导入把类型 ArrayList 带到短名可用,就像导入页的 import kit.Bell; 把 Bell 带到短名。没有这行,javac 在本页看不到短名 ArrayList。仔细写出包名 java.util 和类名 ArrayList。不要在本页把 import java.util.*; 当成必需要求——一条精确导入就够。
在 main 里创建列表:
ArrayList<String> tags = new ArrayList<String>();
尖括号里是 String,因为本课存放单词。名称 tags 按保留文件原样输入。调用 new ArrayList<String>() 构建空列表对象。此刻列表有零个值。现在打印会显示 [],但保留文件会在打印前加入单词。
先加 oak,再加 pine,再打印
单独一行调用 tags.add("oak");。下一行调用 tags.add("pine");。每次调用保存一个带引号的词。顺序对屏幕很重要:先 oak,后 pine。不要在保留文件里对调。本页教学文件不要加第三个词——两次 add 就足以看到增长和打印形状。
然后写:
System.out.println(tags);
传入列表名本身。不要给 tags 加引号。不要把手写的 System.out.println("oak"); 当成本课路径——要点是列表对象带着两个词一起打印。编译前保存文件。
import java.util.ArrayList;
public class Shelf {
public static void main(String[] args) {
ArrayList<String> tags = new ArrayList<String>();
tags.add("oak");
tags.add("pine");
System.out.println(tags);
}
}
在存放 Shelf.java 的文件夹里运行 javac Shelf.java。当圆括号、花括号、尖括号和分号匹配时,javac 自己不写任何行。然后运行 java Shelf——不要 java Shelf.java,也不要 java ArrayList。运行命令去掉 .java 结尾。启动带 main 的类。
程序应打印一行后停止:[oak, pine]。它不会让你输入。如果终端在等待键盘输入,说明某个文件里还留着旧练习的 nextLine 调用。删掉那个调用,保留 ArrayList 创建、两行 add 以及 System.out.println(tags);。
把运行走一遍。Java 从 Shelf.main 开始。导入已经指明你要哪个 ArrayList。new 行构建空列表。第一次 add 存入 oak。第二次 add 存入 pine。打印行让列表显示内容。屏幕显示 [oak, pine]。不应再打印别的。若看到 ding、9 或 ok,说明你仍在运行旧的 Porch、Lobby、Pier 或 Yard 程序。改跑 java Shelf。
若 javac 说找不到 ArrayList,说明导入行缺失、拼错,或写在 public class Shelf 之后。把 import java.util.ArrayList; 移到类行上方。若写成无引号的 tags.add(oak);,javac 会把 oak 当成不存在的名字。每个词都保留引号。若写成 String[] tags = new ArrayList<String>();,类型不一致,javac 会拒绝——本页创建行两侧都保持 ArrayList<String>。
固定数组与增长列表并排
一段短对比让数组页留在视野里,却不混进教学运行。固定的 String[] 仍然可用。它不会用 add 增长。
public class Shelf {
public static void main(String[] args) {
String[] trees = {"oak", "pine"};
System.out.println(trees[0]);
}
}
只为记住固定形状而编译运行这段对比。屏幕显示 oak——一个格子——不是 [oak, pine]。没有 add 调用。要在固定数组里存第三个词,需要带三个格子的新数组。ArrayList 教学文件是带 import java.util.ArrayList;、两次 add 和 System.out.println(tags); 的那份。固定数组文件只作提醒,不是测验路径。不要把 trees.add("elm") 混进这段对比——String[] 没有 add,javac 会拒绝。
并排对照
一张短表把差别说清楚。
📊 ArrayList vs String array
| Piece | On this page |
|---|---|
| create | ArrayList<String> tags = new ArrayList<String>(); |
| grow | tags.add("oak"); then tags.add("pine"); |
| print list | System.out.println(tags); → [oak, pine] |
| fixed array | String[] trees = {"oak", "pine"}; — no add |
表格只是提醒。教学文件要保留的键入片段是导入、ArrayList 创建、两次 add,以及打印 tags。 |
与 import、与数组对比
在导入页,Porch 在 import kit.Bell; 之后调用 Bell.ring();。那作为历史仍然成立。本页把角色换成 Shelf,把导入换成 java.util.ArrayList。残留的 Bell.ring(); 是另一课。本页保留 ArrayList<String> tags、两行 add,并打印列表。
在数组页,花括号填满固定的 String[]。已知大小时那仍然可用。本课选择 ArrayList,让你看到用 add 增长,以及一次打印整份列表。不要在本页同一份 Shelf 演示里混用 plants[0] 和 tags.add("oak")。一条清楚路径就够:导入、创建、add、add、打印。
以后若需要 get、size 或 remove,下一页——list 方法——会覆盖那些调用。这里先留在 add 和完整列表打印。不要把遍历列表当成硬性要求;打印列表对象就足以看到两个词。
留给 list 方法的内容
本页用可增长列表打开 Collections。下一页练习常见的列表调用,例如读取一个格子或询问有多少值。这里先留在 add 和完整打印。除非你已经会,否则不要把 tags.get(0) 当成硬性要求;目标是增长的列表和屏幕上的 [oak, pine]。
若附近还有旧的 Porch.java 或 Lobby.java,可以留着,只有在干扰运行命令时再删。编译本课的 ArrayList 文件后运行 java Shelf。
进入 list 方法之前
你可以导入 java.util.ArrayList,创建 ArrayList<String> tags,调用 tags.add("oak"); 和 tags.add("pine");,再打印 tags。编译 Shelf.java 并运行 java Shelf。屏幕显示 [oak, pine]。列表用 add 增长了。下一页是 list 方法,你会取到一个值,或询问列表有多长。
把导入留在类上方。把两次 add 留在打印之前。本课继续运行 java Shelf。这三条习惯是本页继续前进前的检查点。两次 add 之后屏幕显示 [oak, pine] 时,ArrayList 完成本课任务,你就可以进入下一主题。
🧠 测试您的知识
测试您的知识
通过这个互动测验挑战自己,看看你对这个主题的理解程度如何
📝 说明
- 仔细阅读每个问题
- 为每个问题选择最佳答案
- 您可以随时重新参加测验
- 您的进度将显示在顶部