java的array
在Java中,数组(Array)是一种最基础且重要的数据结构。它是一个固定大小的的容器,用于存储相同类型的元素。
下面我将从基础概念、声明初始化、常用操作、内存分析以及优缺点等方面,为你系统地介绍 Java 的数组。
1. 数组的基本特征
- 类型确定:数组只能存储同一种数据类型的元素(可以是基本数据类型,也可以是引用数据类型)。
- 长度固定:数组一旦创建,其长度(容量)就不能改变。
- 连续内存:数组在内存中是连续存储的,因此可以通过索引(下标)快速定位元素。
- 下标从0开始:数组的索引范围是
0到length - 1。
2. 数组的声明与初始化
在Java中,声明和初始化数组主要有以下几种方式:
A. 动态初始化(只指定长度,系统赋默认值)
java
// 声明并分配内存空间(此时数组元素为默认值)
int[] arr1 = new int[5]; // 创建一个长度为 5 的整型数组
// 默认值规律:
// 整型 (byte, short, int, long) -> 0
// 浮点型 (float, double) -> 0.0
// 字符型 (char) -> '\u0000' (空字符)
// 布尔型 (boolean) -> false
// 引用类型 (String, Object等) -> null
B. 静态初始化(指定具体元素,系统自动计算长度)
java
// 方式一(常用,简化版)
int[] arr2 = {1, 2, 3, 4, 5};
// 方式二(完整版)
int[] arr3 = new int[]{1, 2, 3, 4, 5};
注意:
int[] arr是Java推荐的写法。虽然写成int arr[]也可以(兼容C++习惯),但不推荐。
3. 访问和修改数组元素
通过索引来访问或修改元素:
java
int[] arr = {10, 20, 30};
// 读取元素
System.out.println(arr[0]); // 输出 10
// 修改元素
arr[1] = 50;
System.out.println(arr[1]); // 输出 50
// 获取数组长度
System.out.println(arr.length); // 输出 3 (注意:length是属性,没有括号)
- 常见报错:如果访问的索引超出了范围(如
arr[3]或arr[-1]),程序会抛出ArrayIndexOutOfBoundsException(数组越界异常)。
4. 遍历数组
遍历数组有两种主流方式:
A. 传统 for 循环(需要使用索引)
java
int[] arr = {1, 2, 3, 4, 5};
for (int i = 0; i < arr.length; i++) {
System.out.println("索引 " + i + " 的元素是: " + arr[i]);
}
B. 增强 for 循环 (foreach)(只读,无法修改元素,更简洁)
java
int[] arr = {1, 2, 3, 4, 5};
for (int num : arr) {
System.out.println(num);
}
5. 二维数组(多维数组)
Java 中的多维数组本质上是“数组的数组”。
java
// 声明一个 3行4列 的二维数组
int[][] matrix = new int[3][4];
// 静态初始化
int[][] matrix2 = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 遍历二维数组
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();
}
6. 常用工具类:java.util.Arrays
Java 提供了 Arrays 工具类来方便我们操作数组。使用前需要 import java.util.Arrays;。
java
int[] arr = {3, 1, 5, 2, 4};
// 1. 打印数组(直接 print(arr) 会打印出内存地址,必须用 toString)
System.out.println(Arrays.toString(arr)); // 输出: [3, 1, 5, 2, 4]
// 2. 数组排序(升序)
Arrays.sort(arr);
System.out.println(Arrays.toString(arr)); // 输出: [1, 2, 3, 4, 5]
// 3. 填充数组
int[] newArr = new int[5];
Arrays.fill(newArr, 9);
System.out.println(Arrays.toString(newArr)); // 输出: [9, 9, 9, 9, 9]
// 4. 比较两个数组是否相同
int[] arrA = {1, 2, 3};
int[] arrB = {1, 2, 3};
boolean isEqual = Arrays.equals(arrA, arrB); // true
// 5. 二分查找(必须先排序)
int index = Arrays.binarySearch(arr, 3); // 返回索引位置
7. 数组的内存分析(核心原理)
Java 的内存分为栈(Stack)和堆(Heap):
- 栈:存放局部变量。数组变量名(如
int[] arr)就存放在栈中,它保存的是一个引用地址。 - 堆:存放具体的对象和数组实体。用
new创出来的数组实际数据都存在堆中。
当写下 int[] arr = new int[3]; 时:
- 在堆内存中开辟连续的3个空间,并赋默认值
0。 - 生成该空间的首地址(例如
0x1122)。 - 在栈内存中声明变量
arr,并将地址0x1122赋值给arr。 - 所以,
arr实际上是一个指向堆内存的指针(引用)。
8. 优缺点对比
| 优点 | 缺点 |
|---|---|
| 查询速度极快 (),因为可以通过首地址和索引直接计算出任意元素的内存地址。 | 大小固定:创建后无法动态扩容。要扩容只能新建大数组并复制数据。 |
| 内存紧凑,空间利用率高(没有额外的链表指针等开销)。 | 插入和删除慢 ():因为需要移动后面的所有元素。 |
| 易于使用,支持多维。 | 只能存储单一类型的元素。 |
总结
如果你的数据量是固定的,且需要频繁查找,Java 的 Array 是最好的选择;如果你需要动态增删数据,应该使用 Java 集合框架中的 ArrayList。