数组是 Java 中用来存储固定大小的同类型元素的数据结构。数组在内存中是连续存储的,可以通过索引访问元素。
数组的特点
-
固定长度 - 一旦创建,大小不能改变
-
相同类型 - 所有元素必须是同一数据类型
-
快速访问 - 通过索引直接访问,时间复杂度 O(1)
-
内存连续 - 元素在内存中是连续存储的
-
下标从0开始 - 第一个元素索引是0,最后一个元素索引是
length-1
声明和初始化数组
1. 声明数组
// 声明语法
数据类型[] 数组名; // 推荐方式
或
数据类型 数组名[]; // C风格,不推荐
示例:
int[] numbers; // 声明整型数组
String[] names; // 声明字符串数组
double scores[]; // 不推荐这种声明方式
2. 初始化数组
(1) 静态初始化 - 声明时直接赋值
// 完整语法
数据类型[] 数组名 = new 数据类型[]{元素1, 元素2, ...};
// 简化语法
数据类型[] 数组名 = {元素1, 元素2, ...};
示例:
int[] arr1 = new int[]{1, 2, 3, 4, 5};
int[] arr2 = {1, 2, 3, 4, 5}; // 简化写法
String[] fruits = {"Apple", "Banana", "Orange"};
(2) 动态初始化 - 先声明大小再赋值
数据类型[] 数组名 = new 数据类型[长度];
示例:
int[] numbers = new int[5]; // 创建长度为5的整型数组
String[] names = new String[3]; // 创建长度为3的字符串数组
// 后续赋值
numbers[0] = 10;
numbers[1] = 20;
// ...
names[0] = "Alice";
names[1] = "Bob";
访问数组元素
数组名[索引] // 访问元素
数组名[索引] = 值 // 修改元素
示例:
int[] nums = {10, 20, 30, 40, 50};
// 访问第3个元素(索引2)
int third = nums[2]; // 30
// 修改第1个元素(索引0)
nums[0] = 100; // 数组变为 {100, 20, 30, 40, 50}
数组长度
使用length
属性获取数组长度:
int len = 数组名.length;
示例:
int[] arr = {1, 2, 3};
System.out.println(arr.length); // 输出3
多维数组
Java 支持多维数组,最常见的是二维数组。
1. 声明和初始化
// 静态初始化
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 动态初始化
int[][] matrix = new int[3][3]; // 3行3列
2. 访问元素
int value = matrix[行索引][列索引];
示例:
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
System.out.println(matrix[1][2]); // 输出6(第2行第3列)
数组的常用操作
1. 遍历数组
// 使用for循环
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
// 使用增强for循环(foreach)
for(int num : arr) {
System.out.println(num);
}
2. 数组排序
import java.util.Arrays;
int[] numbers = {5, 2, 9, 1, 5};
Arrays.sort(numbers); // 升序排序
3. 数组复制
// 使用Arrays.copyOf()
int[] copy = Arrays.copyOf(original, newLength);
// 使用System.arraycopy()
System.arraycopy(src, srcPos, dest, destPos, length);
4. 数组转字符串
String str = Arrays.toString(arr);
注意事项
-
数组越界 - 访问超出索引范围会抛出
ArrayIndexOutOfBoundsException
int[] arr = new int[3]; int x = arr[3]; // 错误!最大索引是2
-
空指针异常 - 未初始化的数组为null,访问会抛出
NullPointerException
int[] arr; System.out.println(arr[0]); // 错误!arr未初始化
-
基本类型数组与对象数组的区别:
-
基本类型数组直接存储值
-
对象数组存储的是引用
-
-
数组与集合的区别:
-
数组大小固定,集合大小可变
-
数组可以存储基本类型和对象,集合只能存储对象
-
数组效率更高,集合功能更丰富
-
实用技巧
-
可变参数本质上是数组:
public void printNumbers(int... numbers) { // numbers是一个int数组 }
-
使用
Arrays
工具类进行各种操作:Arrays.fill(arr, value); // 填充数组 Arrays.equals(arr1, arr2); // 比较数组 Arrays.binarySearch(arr, key);// 二分查找
-
Java 8+ 流式处理数组:
int[] numbers = {1, 2, 3, 4, 5}; int sum = Arrays.stream(numbers).sum();