第 6 课 / 共 9 课16 分钟2 个闯关

数组、ArrayList 与 HashMap

长度固定 vs 能伸缩;泛型是干什么的;打印数组的正确姿势。

数组:长度固定的一排格子

int[] scores = new int[3];       // 创建长度为 3 的数组,初值都是 0
scores[0] = 88;
scores[1] = 92;
scores[2] = 79;

int[] nums = {88, 92, 79};       // 声明时直接给值,更常用
String[] names = {"小明", "小红"};

System.out.println(nums.length);  // 3
System.out.println(nums[0]);      // 88

数组长度一旦确定就不能改。 想加第 4 个元素?做不到,只能新建一个更大的数组把内容搬过去。

下标从 0 开始,越界会抛 ArrayIndexOutOfBoundsExceptionnums[3] 就越界了——长度 3 的数组,合法下标是 0、1、2。

数组的默认初值:数字类型是 0,boolean 是 false,对象类型(含 String)是 null。忘了这一点,遍历 String 数组时容易吃 NullPointerException

常用工具

import java.util.Arrays;

int[] nums = {3, 1, 4, 1, 5};
Arrays.sort(nums);                        // 原地排序 → [1,1,3,4,5]
System.out.println(Arrays.toString(nums)); // 打印数组必须用它

直接 System.out.println(nums) 会打出 [I@1b6d3586 这种鬼东西——那是内存地址,不是内容。打印数组一律用 Arrays.toString()

ArrayList:能伸缩的数组

数组长度固定太难用了,实际开发中绝大多数时候用 ArrayList

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

List<String> names = new ArrayList<>();

names.add("小明");           // 追加
names.add("小红");
names.add(0, "小刚");        // 插到指定位置

System.out.println(names.get(0));     // 小刚
System.out.println(names.size());     // 3     ← 注意是 size(),不是 length
System.out.println(names.contains("小红"));  // true

names.set(0, "小强");        // 改
names.remove("小强");        // 按内容删
names.remove(0);             // 按下标删

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

尖括号是什么

List<String> 里的 <String>泛型,意思是"这个列表里只准装 String"。

好处是编译器会替你把关:往 List<String>add(123) 直接编译失败,而不是等到运行时才炸。取出来时也不用强制转换。

new ArrayList<>() 右边的尖括号可以留空,编译器会自动推断——这叫菱形语法。

泛型里不能写基本类型。 List<int> 是错的,要写 List<Integer>。Integer 是 int 的"包装类",Java 会自动在两者间转换(叫自动装箱)。

HashMap:键值对

相当于 Python 的字典:

import java.util.HashMap;
import java.util.Map;

Map<String, Integer> scores = new HashMap<>();
scores.put("小明", 88);
scores.put("小红", 95);

System.out.println(scores.get("小明"));            // 88
System.out.println(scores.get("小刚"));            // null ← 不存在返回 null,不报错
System.out.println(scores.getOrDefault("小刚", 0)); // 0   更安全
System.out.println(scores.containsKey("小红"));    // true

for (Map.Entry<String, Integer> e : scores.entrySet()) {
    System.out.println(e.getKey() + ": " + e.getValue());
}

get 返回 null 而不是报错,这意味着如果你直接拿它做运算,会在离出错点很远的地方抛空指针。所以能用 getOrDefault 就用它。

怎么选

  • 长度固定、追求极致性能、装基本类型 → 数组
  • 其它绝大多数情况 → ArrayList
  • 要按名字查 → HashMap

新手期直接用 ArrayList 和 HashMap,不会错。

10 秒自测

List<String> list 求长度用 list.length 还是 list.size()

size()。数组用 .length(属性),String 用 .length()(方法),集合用 .size()。三个不一样,混用是日常。

广告位(未配置 AdSense,上线后在此展示)

动手闯关

读懂了不算会,写出来才算

0/2 已通过

闯关和判题完全免费,交错了不扣任何东西。卡住随时点「问 AI」,它能看到你正在写的代码。

关卡 01选择+12 点 · +15 XP

求长度用哪个

下面三种东西求长度,分别用什么?(选出全部正确的说法)

  • 可能是多选,选错不扣点数,随便试。
登录后闯关拿点数
关卡 02选择+10 点 · +15 XP

直接打印数组会发生什么

`int[] a = {1,2,3}; System.out.println(a);` 会输出什么?

  • 可能是多选,选错不扣点数,随便试。
登录后闯关拿点数

学完了?标记一下

标记完成会记进度、涨 20 XP,还会点亮连续学习天数。