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

JavaSE:初识数组

引言:为什么需要数组?

在编程中,我们常需存储同一类型的批量数据(如30天的销售额、100名学生的成绩)。若用独立变量(day1, day2, ... day30),代码将臃肿且难以维护。数组(Array)通过单一变量名+索引高效管理同类数据,是Java核心数据结构之一。


一、一维数组:存储线性数据

1. 声明与初始化

数组在Java中是对象,需先声明再分配内存:

// 方法1:声明后初始化  
int[] sales;  
sales = new int[12]; // 12个月的销售额  // 方法2:声明时初始化  
double[] temperatures = new double[365]; // 365天的温度  // 方法3:直接赋值初始化  
String[] weekdays = {"Mon", "Tue", "Wed", "Thu", "Fri"};  

2. 内存分配原理

数组元素在内存中连续存储,通过基地址+偏移量访问:

内存示例:  
地址 | 1000 | 1004 | 1008 | 1012  
元素 | sales[0] | sales[1] | sales[2] | ...  

访问sales[2] = 基地址(1000) + 2×4字节(int大小) = 1008

3. 关键特性

  • 长度固定:通过length属性获取(sales.length返回12)
  • 索引从0开始:有效范围[0, length-1]
  • 支持匿名数组printArray(new int[]{1, 2, 3});

img


二、多维数组:管理矩阵数据

1. 二维数组声明

// 声明3名学生×4科目的成绩  
int[][] marks = new int[3][4];  // 直接初始化  
int[][] matrix = {  {1, 2, 3},  {4, 5, 6},  {7, 8, 9}  
};  

2. 内存模型

二维数组本质是数组的数组

marks[0][科目1分数, 科目2分数, ...]  
marks[1][科目1分数, 科目2分数, ...]  

img

3. 遍历与长度获取

for (int i = 0; i < marks.length; i++) {        // 行数:marks.length  for (int j = 0; j < marks[i].length; j++) { // 列数:marks[i].length  System.out.print(marks[i][j] + "\t");  }  System.out.println();  
}  

三、数组实战:排序算法

选择排序(Selection Sort)

核心思想:每轮从未排序部分选最小值,交换到已排序末尾。

伪代码:

for i from 0 to array.length-1:  minIndex = i  for j from i+1 to array.length-1:  if array[j] < array[minIndex]:  minIndex = j  swap array[i] and array[minIndex]  

排序过程图解:

image-20250726180742592

img


四、高级特性

存储任意类型

Object[] mixedData = {"Text", 42, 3.14}; // 支持对象和基本类型

匿名数组应用

calculateSum(new int[]{10, 20, 30}); // 无需单独声明

长度不可变

数组一旦创建,大小固定。需调整大小时,需新建数组并复制数据:

int[] newArray = Arrays.copyOf(original, newSize); 

五、常见误区与最佳实践

越界访问

`arr[arr.length]` 会抛出`ArrayIndexOutOfBoundsException`

空指针风险

int[] arr = null;  
System.out.println(arr[0]); // NullPointerException

遍历推荐

使用增强for循环简化代码:

for (int score : scores) {  total += score;  
}  

结语

数组作为Java数据结构的基石,高效处理批量数据。掌握其内存模型多维结构排序算法,能显著提升代码质量。后续可结合ArrayList等集合框架,灵活应对动态数据需求。。

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

相关文章:

  • 小架构step系列26:Spring提供的validator
  • 详细介绍MySQL的索引类型
  • Maven之依赖管理
  • 基于tk界面库的扩展类
  • 网络:基础概念
  • nacos启动报错:Unable to start embedded Tomcat。
  • 基于POD和DMD的压气机叶片瞬态流场分析与神经网络预测
  • iview: 对输入框进行Poptip 换行提示
  • 【Redis】 Redis 基础命令和原理
  • 从治理到共情——平台伦理的乡村共建之路
  • 数据空间技术在智慧水库管理平台中的赋能
  • 每日面试题15:如何解决堆溢出?
  • 2.JVM跨平台原理(字节码机制)
  • 嵌入式硬件篇---zigbee无线串口通信问题解决方法
  • 【6G新技术探索】AG-UI(Agent User Interaction Protocol) 协议介绍
  • 大语言模型 LLM 通过 Excel 知识库 增强日志分析,根因分析能力的技术方案(1):总体介绍
  • 设计模式十一:享元模式(Flyweight Pattern)
  • 融合为体,AI为用:数据库在智能时代的破局之道
  • 快速入门Linux操作系统(一)
  • 测试分类
  • AWD的攻击和防御手段
  • base64魔改算法 | jsvmp日志分析并还原
  • HCLP--MGER综合实验
  • JVM常见工具
  • AI 编程还有多远?我们如何迎接 AI 编程时代?
  • 【MySQL数据库备份与恢复2】备份的三种常用方法
  • MPI练习:前缀和问题
  • Effective C++ 条款4:确定对象被使用前已先被初始化
  • 7月26日星期六今日早报简报微语报早读
  • Effective C++ 条款03:尽可能使用const