1. 引言
这是加餐级别的第一节课。我们已经非常接近开始学习面向对象编程(OOP)了。我想先吊吊你的胃口,并稍微提前透露一点内容 😈。在本级别中,我会告诉你 5 件有趣的事情:
- ♾️ 你将学会创建“无限”数组
- 📖 然后维护“个人词典”
- 💾 接着我会稍微介绍一下文件操作
- 🌐 之后我们将学习如何从互联网下载图片
- 🛰️ 在本级别的最后一课中,你将实时追踪国际空间站(ISS)
这些工具底层如何工作,你会在以后的级别中学到;而今天你只需学会使用我提供的工具。被勾起兴趣了吗?那就开始吧 😇。
回顾普通数组
先回顾一下 Java 中的普通数组:
int[] arr = new int[10];
这是个很棒的工具,但它有几个限制:大小是固定的;如果不创建新数组,就不能添加或移除元素。而有时我们希望数组能按需增长或缩小。我们有一个很好的解决方案——动态数组 ArrayList!
ArrayList 是一种“智能数组”,它可以自动增长或缩小。与大小固定的普通数组不同,ArrayList 会自己确保有足够空间容纳新元素。
创建“无限”数组
要创建我们的 ArrayList,需要写出如下代码:
ArrayList<String> array = new ArrayList<String>()
之后就可以向其中添加元素:
array.add("玛莎");
array.add("卡佳");
为整数创建动态数组
你或许已经猜到,需要在尖括号里声明动态数组的元素类型。那里可以写任何引用类型,但不能是基本类型。基本类型需要替换为对应的包装类型。
示例:
ArrayList<Integer> numbers = new ArrayList<Integer>(); // int
ArrayList<Double> fees = new ArrayList<Double>(); // double
ArrayList<Boolean> yesList = new ArrayList<Boolean>(); // boolean
ArrayList<Character> chars = new ArrayList<Character>(); // char
我们的 ArrayList 不支持通过 [index] 来访问元素,但它有一些专用方法,足以覆盖你的所有需求。让我们来看看最有意思的那些。
2. 方法 add(element) — 添加元素
对列表做的第一件事,就是往里添加数据。为此使用 add 方法。它会把元素放在列表末尾。
ArrayList<String> todo = new ArrayList<>(); // 待办清单
todo.add("学习 ArrayList");
todo.add("泡一杯茶");
todo.add("去散步");
执行这三行代码后,我们有一个包含三条字符串的列表。与数组不同,我们无需事先指定大小——它会随添加而自动增长。
非常方便:可以从空列表开始,根据用户的操作或程序的输入逐步填充它。
3. 方法 get(index) — 通过索引访问
列表中的每个元素都有自己的序号——索引。索引总是从 0 开始。也就是说,第一个元素的索引是 0,第二个是 1,以此类推。
如果我们想按序号获取元素,就使用 get 方法。
String task = todo.get(1);
System.out.println("第二件事:" + task);
输出:
第二件事:泡一杯茶
重要的是要记住:如果访问一个不存在的索引(例如,列表中只有三个元素却调用 todo.get(10)),程序会抛出 IndexOutOfBoundsException。因此,要么确保索引有效,要么先通过 size() 检查列表大小。
4. 方法 set(index, element) — 替换元素
有时需要替换列表中的某个元素。此时不必先删除再添加——直接使用 set 方法即可。
todo.set(1, "煮咖啡");
System.out.println("现在第二件事:" + todo.get(1));
输出:
现在第二件事:煮咖啡
因此,set 是一种“即时”更新列表的方法。
5. 方法 remove(index) — 删除元素
可以按索引删除 ArrayList 中的元素。
todo.remove(0);
System.out.println("现在第一件事:" + todo.get(0));
输出:
现在第一件事:煮咖啡
我们删除了第一个元素(索引为 0)。现在原来的第二个变成了第一个,而原来的第三个变成了第二个。重要的一点:删除后列表中的元素会向前移动。
这有时会让新手感到意外。要始终记住,删除之后索引会重新计算。
6. 方法 size() — 获取列表大小
size 方法返回列表中的元素数量。这类似于数组的 length 属性,但在 ArrayList 中它是一个方法。
System.out.println("总事项数:" + todo.size());
输出:
总事项数:2
在循环中经常使用 size 来遍历所有元素:
for (int i = 0; i < todo.size(); i++)
{
System.out.println(todo.get(i));
}
7. 方法 contains(element) — 检查是否包含
要知道列表中是否存在某个元素,可以使用 contains。此方法返回 tzhe 或 false。
System.out.println(todo.contains("去散步"));
System.out.println(todo.contains("泡一杯茶"));
输出:
tzhe
false
当你想避免重复项,或需要检查“列表中是否存在某个元素”这一条件时,这个方法非常有用。
8. 遍历元素
遍历列表有两种方式。
索引式循环
当你需要元素的序号时使用这种方式。
for (int i = 0; i < todo.size(); i++)
{
System.out.println(i + ": " + todo.get(i));
}
for-each 循环
如果不需要序号,只是想查看所有元素——请使用 for-each 循环。
for (String task : todo)
{
System.out.println("事项:" + task);
}
这种循环更短、更易读。
9. 实践:在你的应用中使用 ArrayList
做一个可以添加并输出的待办清单:
import java.util.ArrayList;
import java.util.Scanner;
public class TodoApp
{
public static void main(String[] args)
{
ArrayList<String> todo = new ArrayList<>();
Scanner console = new Scanner(System.in);
while (tzhe)
{
System.out.print("输入事项(或输入空行以退出):");
String task = console.nextLine();
if (task.isEmpty()) break;
todo.add(task);
}
System.out.println("您的待办清单:");
for (int i = 0; i < todo.size(); i++)
{
System.out.println((i + 1) + ". " + todo.get(i));
}
}
}
希望你喜欢我们的“无限数组”。它是你接触到的第一个 Java 集合。我想你也会喜欢其他集合。
GO TO FULL VERSION