当前位置: 首页 > news >正文

Java数组详解

一、数组的概念与作用

1. 什么是数组?

数组是相同数据类型元素的有序集合,它在内存中占据一块连续的存储空间,通过索引(下标) 快速访问元素(索引从0开始)。

  • 特点:
    • 元素类型必须一致(如int数组只能存整数,String数组只能存字符串)。
    • 长度固定(创建后不可修改,若需动态扩容需手动处理)。
2. 为什么需要数组?

假设需要存储100个学生的成绩,若不用数组,需声明100个变量(score1, score2, ..., score100),操作极其繁琐。
数组的核心作用是批量管理相同类型的数据,通过索引统一访问,大幅简化代码。

二、一维数组(重点)

1. 声明数组

声明数组有两种语法(推荐第一种,更清晰):

// 语法1:数据类型[] 数组名;
int[] scores;  // 声明int类型数组,用于存储成绩
String[] names;  // 声明String类型数组,用于存储姓名// 语法2:数据类型 数组名[];(不推荐,易混淆)
int ages[];

注意:声明时仅定义数组类型,未分配内存,不能直接使用。

2. 初始化数组(分配内存并赋值)

初始化分为静态初始化(已知元素值)和动态初始化(已知长度,值默认)。

(1)静态初始化

直接指定元素值,长度由元素数量自动确定:

// 完整语法
int[] scores = new int[]{90, 85, 95, 78};  // 长度为4
String[] names = new String[]{"张三", "李四", "王五"};  // 长度为3// 简化语法(仅声明时可用)
int[] scores = {90, 85, 95, 78};
String[] names = {"张三", "李四", "王五"};
(2)动态初始化

先指定长度,元素值为默认值(整数0、浮点数0.0、布尔值false、引用类型null):

// 语法:数组名 = new 数据类型[长度];
int[] nums = new int[5];  // 长度为5,默认值:[0, 0, 0, 0, 0]
String[] arr = new String[3];  // 默认值:[null, null, null]

注意:静态初始化与动态初始化不能混用(如int[] arr = new int[3]{1,2,3}; 错误)。

3. 访问数组元素

通过索引0长度-1)访问,语法:数组名[索引]

int[] scores = {90, 85, 95, 78};
// 访问元素
System.out.println(scores[0]);  // 输出90(第一个元素)
System.out.println(scores[2]);  // 输出95(第三个元素)// 修改元素
scores[1] = 88;  // 将第二个元素(索引1)改为88
System.out.println(scores[1]);  // 输出88

风险:若索引超出范围(如访问scores[4],长度为4,最大索引3),会抛出ArrayIndexOutOfBoundsException(数组索引越界异常),需严格避免。

4. 数组长度

通过数组名.length获取长度(固定值,不可修改):

int[] scores = {90, 85, 95, 78};
System.out.println(scores.length);  // 输出4(长度为4)
5. 遍历数组(访问所有元素)

遍历是数组最常用操作,有for循环增强for循环(foreach) 两种方式。

(1)普通for循环(推荐,可操作索引)
int[] scores = {90, 85, 95, 78};
// 循环索引:从0到length-1
for (int i = 0; i < scores.length; i++) {System.out.println("第" + (i+1) + "个成绩:" + scores[i]);
}
(2)增强for循环(仅遍历元素,无索引)
int[] scores = {90, 85, 95, 78};
// 语法:for(元素类型 变量名 : 数组名)
for (int score : scores) {  // 依次取出数组元素,赋值给scoreSystem.out.println("成绩:" + score);
}

三、二维数组(数组的数组)

二维数组可理解为“表格”(行+列),本质是一维数组的每个元素都是另一个一维数组

1. 声明与初始化
(1)静态初始化(已知所有元素)
// 完整语法:每行元素用{}包裹,整体再用{}
int[][] matrix = new int[][]{{1, 2, 3},  // 第0行:3个元素{4, 5},     // 第1行:2个元素(二维数组行长度可不同){6}         // 第2行:1个元素
};// 简化语法
int[][] matrix = {{1, 2, 3},{4, 5},{6}
};
(2)动态初始化(已知行数和列数)
// 语法:new 数据类型[行数][列数]
int[][] students = new int[3][2];  // 3行2列,默认值全为0
// 第0行:[0, 0],第1行:[0, 0],第2行:[0, 0]

注意:二维数组支持“不规则数组”(每行长度不同):

int[][] arr = new int[3][];  // 声明3行,但列数不确定
arr[0] = new int[2];  // 第0行2列
arr[1] = new int[4];  // 第1行4列
arr[2] = new int[1];  // 第2行1列
2. 访问与遍历二维数组

通过数组名[行索引][列索引]访问元素,遍历需嵌套for循环。

int[][] matrix = {{1, 2, 3},{4, 5},{6}
};// 访问第1行第0列元素(值为4)
System.out.println(matrix[1][0]);  // 输出4// 遍历二维数组(外层循环行,内层循环列)
for (int i = 0; i < matrix.length; i++) {  // matrix.length:行数(3)// 内层循环:当前行的列数(matrix[i].length)for (int j = 0; j < matrix[i].length; j++) {System.out.print(matrix[i][j] + " ");}System.out.println();  // 每行结束换行
}

输出结果

1 2 3 
4 5 
6 

四、数组工具类java.util.Arrays(必学)

Arrays类提供了大量操作数组的静态方法,无需手动实现复杂逻辑。

1. 排序(Arrays.sort()

对数组元素升序排序(intString等类型均支持):

import java.util.Arrays;  // 必须导入public class Test {public static void main(String[] args) {int[] nums = {3, 1, 4, 2};Arrays.sort(nums);  // 排序后:[1, 2, 3, 4]System.out.println(Arrays.toString(nums));  // 打印数组}
}
2. 数组转字符串(Arrays.toString()

直接打印数组名会显示内存地址(如[I@1b6d3586),toString()可格式化输出:

int[] scores = {90, 85, 95};
System.out.println(Arrays.toString(scores));  // 输出:[90, 85, 95]
3. 数组拷贝(Arrays.copyOf()

用于数组扩容或截取(原数组不变,返回新数组):

int[] original = {1, 2, 3};
// 拷贝原数组,新长度为5,超出部分补默认值(0)
int[] expanded = Arrays.copyOf(original, 5);  
System.out.println(Arrays.toString(expanded));  // 输出:[1, 2, 3, 0, 0]// 截取原数组索引0~1(含头不含尾)
int[] sub = Arrays.copyOfRange(original, 0, 2);  
System.out.println(Arrays.toString(sub));  // 输出:[1, 2]
4. 填充数组(Arrays.fill()

将数组所有元素设置为指定值:

int[] arr = new int[4];
Arrays.fill(arr, 6);  // 所有元素设为6
System.out.println(Arrays.toString(arr));  // 输出:[6, 6, 6, 6]

五、数组常见问题

  1. 索引越界异常:访问索引 >= 长度或负数索引时抛出,需确保索引在0 ~ 长度-1范围内。
  2. 空指针异常:数组未初始化(仅声明)时使用,如int[] arr; System.out.println(arr[0]);
  3. 长度固定:数组长度一旦确定不可修改,若需动态增减元素,需手动拷贝到新数组(或使用ArrayList)。

总结

  • 数组是相同类型元素的有序集合,通过索引快速访问,解决批量数据管理问题。
  • 一维数组核心:声明→初始化(静态/动态)→遍历(for/foreach)。
  • 二维数组是“数组的数组”,需嵌套循环遍历。
  • Arrays工具类简化排序、拷贝等操作,是开发必备。

通过 练习 案例,可快速掌握数组用法。

http://www.lryc.cn/news/599072.html

相关文章:

  • S7-1500 与 ET200MP 的组态控制通信(Configuration Control)功能实现详解(下)
  • 【C++进阶】第7课—红黑树
  • SQLFluff
  • Microsoft-DNN NTLM暴露漏洞复现(CVE-2025-52488)
  • RWA的法律合规性如何保证?KYC/AML在RWA项目中的作用是什么?
  • 融合与智能:AI 浪潮驱动下数据库的多维度进化与产业格局重塑新范式
  • 【Java学习】匿名内部类的向外访问机制
  • Android Camera setRepeatingRequest
  • 星慈光编程虫2号小车讲解第三篇--附件概述
  • 星慈光编程虫2号小车讲解第四篇--触摸按键
  • 星慈光编程虫2号小车讲解第一篇--向前向后
  • 【Web APIs】JavaScript 节点操作 ⑧ ( 删除节点 - removeChild 函数 | 删除节点 - 代码示例 | 删除网页评论案例 )
  • 【软件与环境】--SSH连接远程服务器工具:FinalShell
  • LLM中的位置嵌入矩阵(Position Embedding Matrix)是什么
  • Python编程进阶知识之第五课处理数据(matplotlib)
  • 星慈光编程虫2号小车讲解第二篇--向左向右平移
  • Linux join命令快速从大文件中匹配内容
  • C语言:20250724笔记(函数-指针)
  • STL学习(?map容器)
  • Linux 内核基础统简全解:Kbuild、内存分配和地址映射
  • 量子威胁下的区块链进化:后量子密码学时代的分布式账本革命
  • 《 java 随想录》| 数组
  • ollama无法拉取模型导致报错
  • Java并发编程第八篇(CountDownLatch组件分析)
  • Python Day15 面向对象核心特性笔记 及 例题分析
  • 深度学习(鱼书)day01--感知机
  • 基于CloudBase+React+CodeBudddy的云上智能睡眠应用开发实践
  • Rust与YOLO目标检测实战
  • rust-结构体使用示例
  • 论文阅读:《无约束多目标优化的遗传算法,群体和进化计算》