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 了。

笔记加载中…