数组:长度固定的一排格子
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 开始,越界会抛 ArrayIndexOutOfBoundsException。nums[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()。三个不一样,混用是日常。