Java 数组
数组是"同一类型数据"的定长容器,按下标存取,是 Java 中最基础的数据结构。虽然集合功能更强,但理解数组有助于把握内存布局,也是学习集合的铺垫。
声明、创建与初始化
先声明再创建,也可一步完成;初始化有三种写法:
// 片段需放进 main 方法中运行
int[] a = new int[3]; // ① 定长度:元素取默认值 0
int[] b = new int[]{1, 2, 3}; // ② new 加初值
int[] c = {1, 2, 3}; // ③ 字面量简写(最常用)
String[] names = new String[2]; // 对象数组默认 null
存取、遍历与 length
下标从 0 开始,越界抛 ArrayIndexOutOfBoundsException;length 是属性不是方法。
public class ArrayDemo {
public static void main(String[] args) {
int[] nums = {10, 20, 30};
nums[1] = 99; // 按下标改值
System.out.println(nums[1]); // 输出:99
System.out.println(nums.length); // 输出:3
for (int x : nums) { // 增强 for 遍历
System.out.print(x + " "); // 输出:10 99 30
}
}
}
数组复制
System.arraycopy 精确指定源、目标与长度;Arrays.copyOf 更省事,还能顺带扩容。
// 片段需放进 main 方法中运行(文件顶部需 import java.util.Arrays)
int[] src = {1, 2, 3};
int[] d1 = new int[3];
System.arraycopy(src, 0, d1, 0, 3); // 源, 源起点, 目标, 目标起点, 长度
int[] d2 = Arrays.copyOf(src, 5); // 复制并扩到 5,多出的补 0
System.out.println(Arrays.toString(d1)); // 输出:[1, 2, 3]
System.out.println(Arrays.toString(d2)); // 输出:[1, 2, 3, 0, 0]
Arrays 工具类
| 方法 | 作用 |
|---|---|
| sort(arr) | 升序排序 |
| binarySearch(arr, key) | 二分查找,找不到返回负数 |
| fill(arr, val) | 用 val 填充 |
| equals(a, b) | 内容是否相等 |
| toString(arr) | 转为可读字符串 |
// 片段需放进 main 方法中运行(文件顶部需 import java.util.Arrays)
int[] arr = {5, 2, 9, 1};
Arrays.sort(arr); // 升序排序
System.out.println(Arrays.toString(arr)); // 输出:[1, 2, 5, 9]
System.out.println(Arrays.binarySearch(arr, 5)); // 输出:2
多维数组
数组的元素还是数组,即多维数组;各"行"长度不同时称不规则数组。
public class TwoDimDemo {
public static void main(String[] args) {
int[][] grid = new int[2][3]; // 2 行 3 列
grid[1][2] = 8; // 按 [行][列] 存取
System.out.println(grid[1][2]); // 输出:8
int[][] tri = new int[3][]; // 不规则数组:只定行数
tri[0] = new int[2];
tri[1] = new int[4];
System.out.println(tri[1].length); // 输出:4
int[][] table = {{1, 2}, {3, 4}}; // 初始化简写
System.out.println(table[0][1]); // 输出:2
}
}
方法参数与返回值(引用传递)
传数组时传的是"引用副本":方法内外指向同一块内存,方法内修改会影响原数组;方法也能把数组作为返回值。
// 片段需放进 main 方法中运行
int[] a = {1, 2, 3};
int[] b = a; // b 与 a 指向同一块数组内存
b[0] = 99;
System.out.println(a[0]); // 输出:99(改 b 即改 a)
小结:声明、初始化、存取、遍历是数组基本功,复制、排序、查找交给 System.arraycopy 与 Arrays 工具类;多维数组本质是"数组的数组"。数组长度固定是短板,需要动态增删元素时,就该用 ArrayList 了。