Java数组:特性、初始化、遍历、多维数组与常用操作

目录

前言

一、初识数组

1. 数组的定义

2. 数组的核心特点(必考)

3. 数组的声明与初始化

(1)数组声明语法

(2)静态初始化

(3)动态初始化

4. 数组默认初始化值规则

二、数组元素访问与修改

1. 数组索引规则

2. 元素访问与修改代码实战

三、数组长度与越界异常

1. 数组长度属性 length

2. 数组越界异常演示

四、数组遍历(开发最常用)

1. 普通for循环遍历(可操作索引、可修改元素)

2. 增强for循环(只读遍历,简洁高效)

五、多维数组(二维数组为主)

1. 二维数组概念

2. 二维数组初始化与遍历

六、数组常用工具类操作(Arrays)

1. 数组排序 Arrays.sort()

2. 数组复制(两种方式)

3. 二分查找 binarySearch

七、数组致命缺点与动态数组解决方案

1. 数组致命短板

2. 动态替代方案:ArrayList

八、全文总结


前言

数组是 Java 中最基础、最重要的数据结构,也是集合、算法、数据存储的底层基石。相比于变量只能存储单个数据,数组可以批量存储一组相同类型的数据

很多初学者对数组的长度不可变、索引机制、内存特性、遍历方式、数组工具类操作理解模糊,导致后续集合、算法刷题、业务代码频繁踩坑。

本文从零完整讲解 Java 数组全套知识点,包含定义特点、初始化方式、默认值、索引操作、遍历、多维数组、数组常用工具类操作及数组与 ArrayList 的区别,搭配全套可运行代码,适合零基础入门与面试复习。

一、初识数组

1. 数组的定义

数组是存储一组相同数据类型、连续内存空间的数据结构。数组中每一个数据称为元素,元素通过索引(下标)进行访问。

简单理解:数组就是批量变量的容器,解决单个变量只能存一条数据的问题。

2. 数组的核心特点(必考)

  • 长度固定不可变:数组一旦初始化开辟内存,长度永久固定,无法动态扩容缩容

  • 类型统一:数组内所有元素必须是相同数据类型

  • 内存连续:元素在内存中连续存储,查询速度极快,增删需要移动元素

  • 索引从零开始:有效索引范围0 ~ 长度-1

正因内存连续的特性:数组查询快、增删慢。删除/插入中间元素时,后面所有元素需要移位,性能损耗大;且数组没有真正删除元素的方法,只能覆盖赋值。

3. 数组的声明与初始化

Java 数组分为静态初始化动态初始化

(1)数组声明语法
// 标准写法(推荐) 数据类型[] 数组名; // 老式写法(不推荐) 数据类型 数组名[];
(2)静态初始化

直接给出元素值,系统自动识别数组长度。适用于已知具体元素的场景。

public class ArrayInitDemo { public static void main(String[] args) { // 静态初始化 int[] arr = {11,22,33,44,55}; String[] strArr = {"Java","C++","Python"}; System.out.println(arr.length); System.out.println(strArr.length); } }
(3)动态初始化

只指定数组长度,系统自动分配默认值。适用于只知道数量、未知元素的场景。

public class ArrayNewDemo { public static void main(String[] args) { // 动态初始化:长度为5的int数组 int[] arr = new int[5]; // 长度为3的字符串数组 String[] strArr = new String[3]; } }

4. 数组默认初始化值规则

动态初始化后,数组会自动赋予默认值,无需手动赋值:

  • 基本数值类型(byte/short/int/long):默认0

  • 浮点类型(float/double):默认0.0

  • 布尔类型 boolean:默认false

  • 字符类型 char:默认\u0000(空字符)

  • 引用类型(String、对象):默认null

二、数组元素访问与修改

1. 数组索引规则

数组索引从0开始;若数组长度为 n,索引范围:0 ~ n-1

索引小于0 或 索引 >= 数组长度,会抛出:ArrayIndexOutOfBoundsException数组越界异常。

2. 元素访问与修改代码实战

public class ArrayOperateDemo { public static void main(String[] args) { int[] arr = {10,20,30,40}; // 根据索引访问元素 System.out.println("第一个元素:" + arr[0]); System.out.println("第二个元素:" + arr[1]); // 修改元素 arr[0] = 99; arr[2] = 666; System.out.println("修改后第一个元素:" + arr[0]); System.out.println("修改后第三个元素:" + arr[2]); } }

三、数组长度与越界异常

1. 数组长度属性 length

数组提供只读属性数组名.length,可以获取当前数组元素个数。

int[] arr = {1,3,5,7,9}; System.out.println("数组长度:" + arr.length);

2. 数组越界异常演示

public class ArrayOutDemo { public static void main(String[] args) { int[] arr = {10,20,30}; // 有效索引:0、1、2 // arr[3] 超出范围,运行报错 // System.out.println(arr[3]); } }

开发规范:遍历、取值必须保证索引在合法区间,避免数组越界。

四、数组遍历(开发最常用)

1. 普通for循环遍历(可操作索引、可修改元素)

public class ForLoopDemo { public static void main(String[] args) { int[] arr = {11,22,33,44,55}; for (int i = 0; i < arr.length; i++) { System.out.println("索引"+i+":"+arr[i]); } } }

2. 增强for循环(只读遍历,简洁高效)

public class ForEachDemo { public static void main(String[] args) { int[] arr = {11,22,33,44,55}; // 直接取出每一个元素,无索引 for (int num : arr) { System.out.println(num); } } }

场景区别:需要索引、修改元素用普通for;单纯遍历取值用增强for。

五、多维数组(二维数组为主)

1. 二维数组概念

二维数组本质是存放一维数组的数组,常用于表格数据、矩阵、棋盘等场景。

2. 二维数组初始化与遍历

public class TwoArrayDemo { public static void main(String[] args) { // 二维数组静态初始化 int[][] arr = {{1,2,3},{4,5,6},{7,8,9}}; // 双层循环遍历 for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); } } }

六、数组常用工具类操作(Arrays)

Java 提供java.util.Arrays工具类,封装了数组复制、排序、查找、打印等高频方法。

1. 数组排序 Arrays.sort()

import java.util.Arrays; public class ArraySortDemo { public static void main(String[] args) { int[] arr = {5,2,9,1,6}; Arrays.sort(arr); System.out.println(Arrays.toString(arr)); } }

2. 数组复制(两种方式)

import java.util.Arrays; public class ArrayCopyDemo { public static void main(String[] args) { int[] oldArr = {1,2,3,4,5}; // 方式1:Arrays.copyOf 常用 int[] newArr1 = Arrays.copyOf(oldArr,oldArr.length); // 方式2:System.arraycopy 底层高效 int[] newArr2 = new int[oldArr.length]; System.arraycopy(oldArr,0,newArr2,0,oldArr.length); System.out.println(Arrays.toString(newArr1)); } }

3. 二分查找 binarySearch

注意:数组必须先排序才能二分查找

import java.util.Arrays; public class ArraySearchDemo { public static void main(String[] args) { int[] arr = {10,20,30,40,50}; int index = Arrays.binarySearch(arr,30); System.out.println("目标元素索引:"+index); } }

七、数组致命缺点与动态数组解决方案

1. 数组致命短板

  • 长度固定,不适合数据动态增减场景

  • 增删元素效率低,需要移位覆盖

  • 没有封装增删改查方法,原生操作繁琐

2. 动态替代方案:ArrayList

为了解决数组不可变的问题,Java 提供ArrayList 动态数组,底层基于数组封装,具备:

  • 自动扩容、动态长度

  • 内置 add/remove/set/get 丰富方法

  • 业务开发 99% 场景替代原生数组

八、全文总结

1. 数组是固定长度、同类型、连续内存的数据结构,查询快、增删慢;

2. 数组分为静态初始化、动态初始化,拥有统一默认值机制;

3. 通过索引访问元素,索引越界会直接报错;

4. 遍历分为普通for(可改元素)和增强for(只读遍历);

5. Arrays工具类可快速完成排序、复制、查找、打印;

6. 原生数组长度不可变,业务开发优先使用 ArrayList 动态数组。

最后一句

欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。如果在学习的过程中有什么疑问欢迎大家在评论区向我提出。