当前位置: 首页 > 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.dtcms.com/a/299132.html

相关文章:

  • 7月26日星期六今日早报简报微语报早读
  • kafka的消息存储机制和查询机制
  • Android Data Binding 深度解析与实践指南
  • Ubuntu22.04提示找不到python命令的解决方案
  • 测试人员先写测试要点,还是 测试场景?
  • 可调谐激光器原理与设计 【DFB 与 DBR 激光器剖析】
  • HiggsAudio-V2: 融合语言与声音的下一代音频大模型
  • 从零开始大模型之编码注意力机制
  • 设计模式十一:享元模式(Flyweight Pattern)
  • 微信小程序 自定义带图片弹窗
  • 单机版管家婆数据库日志自动清理计划
  • 从一个“诡异“的C++程序理解状态机、防抖与系统交互
  • 原创-锐能微82xx系列电能计量芯片软件驱动开发与精度校准流程完全指南
  • 读心与芯:我们与机器人的无限未来05未来之路
  • 学习随笔录
  • Apache HTTP Server 2.4.49 的目录遍历漏洞CVE-2021-41773
  • xLua和C#交互
  • C#与C++交互开发系列(二十四):WinForms 应用中嵌入C++ 原生窗体
  • 安卓服务与多线程
  • uniapp+高德地图实现打卡签到、打卡日历
  • uniapp input 如何只读禁用输入可点击
  • ISIS GR实验案例
  • 机器学习特征工程:特征选择及在医学影像领域的应用
  • QT中启用VIM后粘贴复制快捷键失效
  • 电子电气架构 --- 车载软件交样评审流程
  • Python 数据分析(二):Matplotlib 绘图
  • Python点阵字生成与优化:从基础实现到高级渲染技术
  • P1064 [NOIP 2006 提高组] 金明的预算方案 题解
  • 主要分布在腹侧海马体(vHPC)CA1区域(vCA1)的混合调谐细胞(mixed-tuning cells)对NLP中的深层语义分析的积极影响和启示
  • LeetCode 刷题【15. 三数之和】