数据类型[] 变量名 = new 数据类型[长度]
创建数组,如 `int[] nums = new int[5数组的基本概念
Java中的数组属于引用类型,即使存储的是原始数据类型(如int
),实际存储的是该类型的值而非对象引用,每个数组都有一个固定的容量,一旦创建无法改变大小,数组的索引从0开始,最大索引值为length 1
。
创建数组的具体方法
声明并实例化空数组
这是最常用的方式,分为三步:声明 → 分配内存 → 可选赋值。
// 示例1:声明并创建长度为5的整型数组 int[] arr1 = new int[5]; // 所有元素默认初始化为0 String[] arr2 = new String[3]; // 所有元素默认初始化为null boolean[] arr3 = new boolean[2]; // 所有元素默认初始化为false
- 语法解析:
new 类型[大小]
,其中类型
可以是任意合法类型(包括自定义类),大小
必须是正整数。 - 默认值规则:数值型(byte/short/int/long/float/double)默认0;布尔型默认
false
;对象型默认null
。 - 方括号位置灵活性:以下写法等价:
int[] arrA = new int[5]; // 推荐写法 int arrB[] = new int[5]; // 旧式C风格,不推荐
静态初始化(直接赋初值)
适用于已知具体元素的场景,无需提前指定长度。
// 示例2:静态初始化 int[] scores = {90, 85, 78, 92}; // 自动推断长度为4 double[] prices = {19.99, 29.99, 39.99}; String[] names = {"Alice", "Bob", "Charlie"};
- 特点:编译器会自动计算花括号内的元素数量作为数组长度。
- 限制:仅能在声明时一次性完成初始化,后续无法通过此语法追加元素。
动态初始化 + 逐个赋值
先创建空数组,再通过循环或手动方式填充元素。
// 示例3:动态初始化后赋值 int[] fibSequence = new int[10]; // 创建长度为10的数组 fibSequence[0] = 0; // 手动赋值 fibSequence[1] = 1; for (int i = 2; i < fibSequence.length; i++) { fibSequence[i] = fibSequence[i-1] + fibSequence[i-2]; // 计算斐波那契数列 }
- 适用场景:当元素值依赖复杂逻辑时(如数学运算、外部输入)。
多维数组的创建
Java支持多维数组,本质是“数组的数组”,以二维数组为例:
// 示例4:二维数组的三种创建方式 // 方式1:不规则二维数组(每行长度不同) int[][] matrix1 = new int[3][]; // 外层长度为3,内层未初始化 matrix1[0] = new int[2]; // 第一行长度为2 matrix1[1] = new int[4]; // 第二行长度为4 matrix1[2] = new int[3]; // 第三行长度为3 // 方式2:规则二维数组(矩形) int[][] matrix2 = new int[3][4]; // 3行4列,总元素数12 // 方式3:静态初始化二维数组 int[][] matrix3 = {{1,2}, {3,4,5}, {6}}; // 三行,长度分别为2/3/1
- 关键点:多维数组的内存分配是分层进行的,高维数组的元素仍是低一维的数组引用。
- 遍历示例:
for (int i = 0; i < matrix3.length; i++) { for (int j = 0; j < matrix3[i].length; j++) { System.out.print(matrix3[i][j] + " "); } System.out.println(); }
对象数组的特殊处理
当数组元素为对象类型时,需显式创建对象实例:
// 示例5:对象数组的初始化 class Person { String name; int age; Person(String n, int a) { name = n; age = a; } } Person[] people = new Person[2]; // 创建两个Person对象的引用数组 people[0] = new Person("张三", 25); // 必须调用构造函数 people[1] = new Person("李四", 30);
- 注意:若未显式初始化对象,数组元素默认为
null
,直接调用方法会抛出NullPointerException
。
关键差异对比表
创建方式 | 语法示例 | 特点 | 适用场景 |
---|---|---|---|
动态初始化 | new int[5] |
长度固定,默认值填充 | 未知初始值的场景 |
静态初始化 | {1,2,3} |
简洁直观,自动推断长度 | 已知全部元素的场景 |
多维数组-规则矩形 | new int[3][4] |
行列固定,内存连续 | 矩阵运算、图像处理 |
多维数组-不规则 | new int[3][] + 逐行分配 |
灵活适应不同行/列需求 | 稀疏数据存储 |
对象数组 | new Person[2] + 构造对象 |
需显式实例化对象 | 存储自定义对象集合 |
常见错误与规避
-
索引越界异常(ArrayIndexOutOfBoundsException)
- 原因:访问索引超出
0
到length-1
范围。 - 解决方案:使用
array.length
获取有效长度,循环时改为i < array.length
而非i <= array.length
。
- 原因:访问索引超出
-
空指针异常(NullPointerException)
- 原因:对象数组未初始化元素即调用方法。
- 解决方案:确保每个元素都被正确实例化,或添加非空判断:
if (people[i] != null) { people[i].sayHello(); }
-
类型不匹配错误
- 原因:向数组中存入与声明类型不符的值。
- 解决方案:严格遵循数组声明的类型约束,必要时进行类型转换。
高级技巧与工具类
-
快速复制数组
使用System.arraycopy()
实现高效复制:int[] src = {1,2,3}; int[] dest = new int[src.length]; System.arraycopy(src, 0, dest, 0, src.length); // 参数依次为:源数组,源起始位置,目标数组,目标起始位置,复制长度
-
利用Arrays工具类
Arrays.toString(arr)
:将数组转为可读字符串。Arrays.sort(arr)
:对数组进行自然排序。Arrays.binarySearch(arr, key)
:二分查找元素位置。
相关问答FAQs
Q1: Java中能否直接扩大已创建数组的大小?
A: 不能,Java数组的长度在创建后不可变,若需扩展,需创建新数组并手动复制元素:
int[] oldArr = {1,2,3}; int[] newArr = new int[oldArr.length 2]; // 扩大一倍 System.arraycopy(oldArr, 0, newArr, 0, oldArr.length); // 复制旧数据到新数组前半部分
替代方案是使用ArrayList
等动态集合类。
Q2: 如何将基本类型数组转换为对象数组?
A: 需借助Stream API
或手动转换,例如将int[]
转为Integer[]
:
int[] primitiveArr = {1,2,3}; Integer[] objectArr = Arrays.stream(primitiveArr) .boxed() // 将int转为Integer .toArray(Integer[]::new); // 收集到Integer数组
注意:此操作会产生额外的装箱开销,仅在
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/94727.html