Java基础 — 数组
介绍
Java数组是存储固定数量同类型元素的有序集合,属于基础数据结构。数组在内存中以连续空间存储数据,通过下标(索引)访问元素,索引从0开始。声明数组时可使用两种语法:数据类型[] 数组名(推荐)或数据类型 数组名[]。创建数组需指定长度,如int[] scores = new int[5]声明长度为5的整型数组,此时所有元素初始化为0(基本类型默认值,对象数组初始化为null)。
数组特点鲜明:长度固定(通过数组名.length获取),元素类型统一,支持随机访问(时间复杂度O(1))。初始化方式分为静态初始化(int[] arr = {1,2,3})和动态初始化。二维数组本质是"数组的数组",例如int[][] matrix = new int[3][4]创建3行4列的矩阵。
尽管数组无法动态扩容,但其高效的读写性能使其广泛应用于数值计算、算法实现等场景,是理解更复杂集合类(如ArrayList)的重要基础。开发中常结合循环结构处理批量数据操作。
数组声明与初始化
- 声明:数据类型[] 数组名;或数据类型 数组名[];
- 初始化:
// 动态初始化(指定长度)int[] arr1 = new int[5]; // 默认值0// 静态初始化(指定元素)int[] arr2 = {1, 2, 3}; String[] names = new String[]{"Alice", "Bob"};
访问与修改元素
索引从0开始,通过数组名[索引]访问元素。
int[] arr = {10, 20, 30};System.out.println(arr[0]); // 输出10arr[1] = 200; // 修改第二个元素为200
数组长度
固定不可变,通过数组名.length获取长度。
int[] arr = new int[5];System.out.println(arr.length); // 输出5
遍历数组
Java数组遍历常用for循环和增强for循环。传统for通过索引访问元素(如for(int i=0; i<arr.length; i++)),增强for直接迭代元素(for(int num : arr))。前者适合索引操作,后者代码更简洁。
普通for循环
for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}
增强for循环(foreach)
for (int num : arr) {System.out.println(num);}
多维数组
Java多维数组是数组的嵌套结构,通过数组元素存储数组实现。二维数组常用,声明如int[][] arr,可动态创建new int[3][4]或静态初始化{{1,2},{3}}。每行长度可不同,适用于矩阵运算、表格数据等场景,通过双重循环遍历操作。
二维数组声明与初始化
int[][] matrix1 = new int[3][3]; // 3行3列int[][] matrix2 = {{1,2}, {3,4,5}}; // 不规则数组
遍历二维数组
for (int i = 0; i < matrix2.length; i++) {for (int j = 0; j < matrix2[i].length; j++) {System.out.print(matrix2[i][j] + " ");}System.out.println();}
数组的默认值
- 基本类型:int默认为0,boolean默认为false。
- 引用类型(如String):默认为null。
数组工具类 Arrays
- 排序:Arrays.sort(arr)
- 二分查找:Arrays.binarySearch(arr, key)
- 填充值:Arrays.fill(arr, 5)
- 转为字符串:Arrays.toString(arr)
int[] arr = {3, 1, 4};Arrays.sort(arr); // arr变为[1, 3, 4]System.out.println(Arrays.toString(arr)); // 输出[1, 3, 4]
数组拷贝
Java数组拷贝常用System.arraycopy()或Arrays.copyOf(),支持浅拷贝。深拷贝需遍历复制或序列化,确保数据独立,避免引用共享问题。
System.arraycopy()
int[] src = {1, 2, 3};int[] dest = new int[3];System.arraycopy(src, 0, dest, 0, src.length);
Arrays.copyOf()
int[] newArr = Arrays.copyOf(src, src.length);
常见错误
- 空指针异常:未初始化的数组直接访问。
int[] arr;System.out.println(arr[0]); // 编译错误!
- 索引越界:访问不存在的索引。
int[] arr = {1, 2};System.out.println(arr[2]); // 运行时抛出ArrayIndexOutOfBoundsException
数组与集合的区别
- 数组:长度固定,可存基本类型和对象。
- 集合(如ArrayList):长度动态增长,只能存对象。
示例代码汇总
public class ArrayDemo {public static void main(String[] args) {// 初始化与遍历int[] arr = {5, 3, 8};for (int num : arr) {System.out.print(num + " "); // 输出5 3 8}// 二维数组int[][] matrix = {{1,2}, {3,4,5}};System.out.println(matrix[1][2]); // 输出5// 使用Arrays工具类Arrays.sort(arr);System.out.println(Arrays.toString(arr)); // 输出[3, 5, 8]}
}
总结
Java数组是存储固定数量同类型元素的数据结构,属于对象类型。声明数组需指定元素类型和方括号,如int[] arr或int arr[],推荐前者规范写法。创建数组必须使用new关键字指定长度,例如int[] arr = new int[5],此时元素会根据数据类型自动初始化默认值(整型0,浮点0.0,布尔false,对象null)。也可直接初始化具体元素:String[] names = {"Alice", "Bob"}。
数组通过从0开始的索引访问元素,arr[0]表示首个元素。数组长度由length属性获取(非方法),创建后长度不可变。若需扩容需新建数组并复制数据,可使用System.arraycopy()方法或Arrays.copyOf()工具类。
多维数组本质是"数组的数组",如二维数组int[][] matrix = new int[3][4]创建3行4列结构,每行可独立指定长度形成锯齿数组。遍历数组通常使用for循环配合索引,增强for循环for(int num : arr)适合只读场景。
数组在内存中以连续空间存储,查询效率高但增删元素效率低。需注意避免ArrayIndexOutOfBoundsException越界异常。实际开发中若需动态扩容,可优先考虑ArrayList集合。数组作为基础数据结构,广泛用于算法实现、矩阵运算及批量数据处理场景。