基于本文回答
0
评论

java的array

在Java中,数组(Array)是一种最基础且重要的数据结构。它是一个固定大小的的容器,用于存储相同类型的元素。

下面我将从基础概念、声明初始化、常用操作、内存分析以及优缺点等方面,为你系统地介绍 Java 的数组。


1. 数组的基本特征

  • 类型确定:数组只能存储同一种数据类型的元素(可以是基本数据类型,也可以是引用数据类型)。
  • 长度固定:数组一旦创建,其长度(容量)就不能改变。
  • 连续内存:数组在内存中是连续存储的,因此可以通过索引(下标)快速定位元素。
  • 下标从0开始:数组的索引范围是 0length - 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]; 时:

  1. 堆内存中开辟连续的3个空间,并赋默认值 0
  2. 生成该空间的首地址(例如 0x1122)。
  3. 栈内存中声明变量 arr,并将地址 0x1122 赋值给 arr
  4. 所以,arr 实际上是一个指向堆内存的指针(引用)。

8. 优缺点对比

优点 缺点
查询速度极快 (O(1)O(1)),因为可以通过首地址和索引直接计算出任意元素的内存地址。 大小固定:创建后无法动态扩容。要扩容只能新建大数组并复制数据。
内存紧凑,空间利用率高(没有额外的链表指针等开销)。 插入和删除慢 (O(n)O(n)):因为需要移动后面的所有元素。
易于使用,支持多维。 只能存储单一类型的元素。

总结

如果你的数据量是固定的,且需要频繁查找,Java 的 Array 是最好的选择;如果你需要动态增删数据,应该使用 Java 集合框架中的 ArrayList

右滑查看面试常问