JAVA基础-数组声明与初始化详解

张开发
2026/6/1 12:43:16 15 分钟阅读
JAVA基础-数组声明与初始化详解
Java数组是一种用于存储固定大小、同类型元素的线性数据结构是Java编程的核心基础之一。其在内存中占用连续空间一旦创建长度便不可更改这既是其特性也是主要限制。一、数组的声明与初始化声明和初始化是使用数组的第一步Java提供了多种灵活的方式具体如下表所示方式语法示例特点与说明仅声明int[] arr;String strArr[];仅声明一个数组引用变量未分配内存空间。int[]是推荐写法int arr[]是C语言风格的遗留写法。动态初始化arr new int[5];使用new关键字在堆内存中分配一个长度为5的数组元素为默认值int为0。声明并动态初始化int[] arr new int[5];最常用的动态初始化方式一步完成声明和空间分配。静态初始化int[] arr new int[]{1, 2, 3};int[] arr {1, 2, 3};创建数组并直接赋值。简化写法{...}更简洁数组长度由元素个数决定。匿名数组new int[]{1, 2, 3}没有名字的数组常用于方法参数传递如printArray(new int[]{1,2,3});。内存与默认值要点数组变量如arr是引用类型存储在栈内存指向堆内存中的实际数组对象。动态初始化时各数据类型的默认值为整数类型0浮点类型0.0布尔类型false字符类型\u0000引用类型null。二、数组元素的访问与遍历通过从0开始的索引可以访问和修改数组中的任何元素。public class ArrayAccessAndTraversal { public static void main(String[] args) { // 静态初始化一个整型数组 int[] scores {85, 92, 78, 90, 88}; // 1. 访问与修改单个元素 int firstScore scores[0]; // 访问索引为0的元素值为85 scores[1] 95; // 修改索引为1的元素为95 // scores[5] 100; // 错误会引发ArrayIndexOutOfBoundsException因为有效索引是0-4。 // 2. 获取数组长度 int len scores.length; // 属性不是方法值为5 System.out.println(数组长度为 len); // 3. 遍历数组 - 标准for循环可获取索引 System.out.println(使用for循环遍历); for (int i 0; i scores.length; i) { System.out.println(scores[ i ] scores[i]); } // 4. 遍历数组 - 增强for循环foreach只读访问元素值 System.out.println(使用foreach循环遍历); for (int score : scores) { System.out.println(score); } // 在foreach循环中修改score变量不会影响原数组因为它是局部副本。 // 5. 遍历并计算平均值 int sum 0; for (int score : scores) { sum score; } double average (double) sum / scores.length; System.out.println(平均分是 average); } }三、多维数组以二维数组为例二维数组可视为一个“数组的数组”常用于表示矩阵、表格等结构。public class MultiDimArrayDemo { public static void main(String[] args) { // 1. 静态初始化一个3x3矩阵 int[][] matrix { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; // 2. 动态初始化 int rows 2; int cols 3; int[][] dynamicMatrix new int[rows][cols]; // 明确指定行和列 // 动态初始化一个不规则数组锯齿数组 int[][] jaggedArray new int[3][]; // 只指定行数 jaggedArray[0] new int[2]; // 第一行2列 jaggedArray[1] new int[]{3, 4, 5}; // 第二行3列并直接赋值 jaggedArray[2] new int[1]; // 第三行1列 // 3. 访问二维数组元素 int element matrix[1][2]; // 访问第2行第3列索引从0开始值为6 matrix[0][0] 100; // 修改元素 // 4. 遍历二维数组 - 嵌套循环 System.out.println(遍历规则二维数组 matrix:); for (int i 0; i matrix.length; i) { // matrix.length 代表行数 for (int j 0; j matrix[i].length; j) { // matrix[i].length 代表第i行的列数 System.out.print(matrix[i][j] \t); } System.out.println(); // 换行 } // 5. 遍历二维数组 - 增强for循环 System.out.println(使用foreach遍历不规则数组 jaggedArray:); for (int[] row : jaggedArray) { // 外层循环得到每一行是一个一维数组 for (int value : row) { // 内层循环遍历该行的每个元素 System.out.print(value ); } System.out.println(); } } }四、数组的复制由于数组长度不可变且直接赋值仅是引用拷贝两个变量指向同一个数组对象因此掌握复制数组内容的方法至关重要。下表对比了几种主要的数组复制方法方法示例代码特点与区别循环赋值for(int i0; isrc.length; i) dest[i] src[i];最基础手动控制对于引用类型数组是浅拷贝。Object.clone()int[] dest src.clone();对象克隆方式基本类型数组为深拷贝引用类型数组为浅拷贝。Arrays.copyOf()int[] dest Arrays.copyOf(src, src.length);最常用可指定新长度用于扩容返回新数组。对于引用类型数组是浅拷贝。System.arraycopy()System.arraycopy(src, 0, dest, 0, src.length);本地方法性能最高需要目标数组已存在。对于引用类型数组是浅拷贝。代码示例数组扩容与复制问题import java.util.Arrays; public class ArrayCopyDemo { public static void main(String[] args) { int[] original {1, 2, 3}; // 示例1使用Arrays.copyOf实现“动态扩容” int[] expanded Arrays.copyOf(original, original.length * 2); System.out.println(扩容后数组: Arrays.toString(expanded)); // 输出[1, 2, 3, 0, 0, 0] // 示例2演示引用类型数组的浅拷贝问题 Person[] team {new Person(Alice), new Person(Bob)}; Person[] teamCopy Arrays.copyOf(team, team.length); // 浅拷贝 teamCopy[0].setName(Carol); // 修改副本中的对象 System.out.println(原始数组第一个人名: team[0].getName()); // 输出Carol原始数组也被修改了 // 示例3深拷贝需手动复制对象内容 Person[] deepCopy new Person[team.length]; for (int i 0; i team.length; i) { deepCopy[i] new Person(team[i].getName()); // 创建新对象 } deepCopy[0].setName(David); System.out.println(深拷贝后原始数组第一个人名: team[0].getName()); // 输出Carol保持不变 } static class Person { private String name; Person(String name) { this.name name; } void setName(String name) { this.name name; } String getName() { return name; } } }五、工具类java.util.Arrays的常见操作Arrays类封装了大量操作数组的静态方法是处理数组的利器。import java.util.Arrays; public class ArraysClassDemo { public static void main(String[] args) { int[] numbers {5, 3, 9, 1, 7}; // 1. 排序升序 Arrays.sort(numbers); // 数组本身被修改为 [1, 3, 5, 7, 9] System.out.println(排序后: Arrays.toString(numbers)); // 2. 二分查找必须在已排序的数组上进行 int index Arrays.binarySearch(numbers, 7); System.out.println(元素7的索引是: index); // 输出3 index Arrays.binarySearch(numbers, 6); // 查找不存在的元素 System.out.println(元素6的返回索引是: index); // 输出负数表示插入点 // 3. 填充数组 int[] filled new int[5]; Arrays.fill(filled, 8); // 所有元素填充为8 Arrays.fill(filled, 1, 4, 9); // 将索引[1,4)范围的元素填充为9 System.out.println(填充后: Arrays.toString(filled)); // 输出[8, 9, 9, 9, 8] // 4. 比较两个数组内容是否相等 int[] a1 {1, 2, 3}; int[] a2 {1, 2, 3}; int[] a3 {1, 3, 2}; System.out.println(a1 equals a2: Arrays.equals(a1, a2)); // true System.out.println(a1 equals a3: Arrays.equals(a1, a3)); // false // 5. 将数组转换为字符串便于输出调试 String arrStr Arrays.toString(numbers); System.out.println(数组字符串: arrStr); // 输出[1, 3, 5, 7, 9] // 6. 使用Stream APIJava 8操作数组 System.out.println(大于5的元素个数: Arrays.stream(numbers).filter(n - n 5).count()); System.out.println(所有元素求和: Arrays.stream(numbers).sum()); } }六、数组的典型应用场景数组因其高效的随机访问特性在多种场景下被广泛应用。数据存储与处理存储一组学生成绩、员工工资、传感器读数等便于进行统计计算求和、平均、最大最小值。算法实现是许多基础算法如排序、查找、动态规划的核心数据结构。缓存实现固定大小的缓存池如对象池、连接池常使用数组实现。表示多维数据二维数组用于表示棋盘、图像像素矩阵三维数组可用于表示空间坐标数据。七、常见问题与注意事项ArrayIndexOutOfBoundsException数组下标越界这是最常见的运行时异常。访问数组时索引必须满足0 index array.length。NullPointerException空指针异常当数组引用变量为null时试图访问其属性如length或元素会引发此异常。长度不可变性如果需要频繁地增加或删除元素应优先考虑使用ArrayList等集合类。内存与性能数组在内存中连续存储访问效率高。但对于超大数组需注意连续内存空间的申请可能失败OutOfMemoryError。参考来源java数组基本用法数组的声明/初始化及一些常用的数组操作java数组操作Java数组声明和创建Java第 4 章 数组与方法数组的定义及使用Java数组的声明与使用Java数组的声明和遍历

更多文章