Java一维数组需掌握声明、初始化与遍历三步核心逻辑:声明仅创建null引用,未实例化则抛NullPointerException;静态初始化适用于编译期已知元素,动态初始化用于运行时确定长度;普通for适合需索引或修改场景,增强for仅限只读遍历。

Java数组不是写个int[] arr = new int[5];就完事了。真正用好它,得清楚声明、初始化、遍历三步各自干了什么,以及每一步踩哪些坑。
声明只是起个名字,不等于能用
写int[] data;或String[] list;,只在栈上建了个引用变量,值是null。这时候访问data.length或list[0],立刻抛NullPointerException。
- 推荐统一用
类型[] 变量名写法(如double[] weights;),语义清晰,避免int arr[]这种C风格带来的混淆 - 局部变量声明后未初始化,编译器会强制要求赋值;类成员变量则自动设为
null(引用类型)或零值(基本类型) - 声明可单独存在,但后续必须完成实例化,才能进入使用流程
初始化分静态和动态,时机和用途不同
初始化不是“填数”那么简单,它决定数据来源、内存分配时机和代码可读性。
-
静态初始化:适用于编译期已知全部元素的场景,比如常量列表、测试数据。
int[] scores = {85, 92, 78};或String[] names = new String[]{"张三", "李四"};—— 长度由元素个数推导,不能拆开写 -
动态初始化:适用于运行时才确定长度,但元素值待填的情况。
double[] temps = new double[7];分配7个0.0,后续再逐个赋值 -
声明与创建分离:常见于延迟初始化或方法参数中。
int[] buffer; buffer = new int[1024];—— 注意buffer此时才真正指向堆内存 - 匿名数组适合一次性传参,如
Arrays.asList(new Integer[]{1, 2, 3}),不占命名空间,但不能赋给未初始化的变量
遍历选对方式,才能安全又高效
遍历不是“跑通就行”,而是要匹配实际需求:要不要下标?能不能改元素?是否只读?
立即学习“Java免费学习笔记(深入)”;
-
普通for循环:需要索引做计算、修改元素、比较相邻项、跳过位置时必须用。
for (int i = 0; i -
增强for循环:仅需读取每个值,且不关心索引时更简洁安全。
for (int num : arr) { ... }—— 但无法获取下标,也不能直接通过num = xxx修改原数组元素 - 打印数组别手写循环,用
Arrays.toString(arr),格式标准、不易出错 - 批量赋值可用
Arrays.fill(arr, 5)或Arrays.setAll(arr, i -> i * 2)(Java 8+)
数组本质是对象,内存行为影响所有操作
理解这点,才能避开空指针、越界、误共享等典型问题。
- 数组是对象,存放在堆内存,变量保存的是地址。两个引用指向同一数组,改一个,另一个也变
- 长度一旦
new int[5]就固定,Java没有扩容机制;arr.length是字段,不是方法调用 - 默认初始化有规律:基本类型按类型设初值(
int→0、boolean→false),引用类型统一为null - 内存连续、下标从0开始,这是底层快速定位的基础——
起始地址 + 元素大小 × 下标


















