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

【Java探索之旅】数组使用 初探JVM内存布局

个人头像
🎥 屿小夏 : 个人主页
🔥个人专栏 : Java编程秘籍
🌄 莫道桑榆晚,为霞尚满天!

文章目录

  • 📑前言
  • 一、数组的使用
    • 1.1 元素访问
    • 1.2 数组遍历
  • 二、JVM的内存布局
  • 🌤️全篇总结

📑前言

使用数组,包括元素访问和数组遍历,是编程学习的基础之一。同时,理解JVM的内存布局对于初学者来说也是至关重要的,特别是对堆和虚拟机栈这两块空间的认识,有助于更好地理解程序运行时的内存管理和数据存储。

一、数组的使用

1.1 元素访问

数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,该编号称为数组的下标,数组可以通过下标访问其任意位置的元素。

int[]array = new int[]{10, 20, 30, 40, 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);
// 也可以通过[]对数组中的元素进行修改
array[0] = 100;
System.out.println(array[0]);

注意事项

  1. 数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的元素
  2. 下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常。
int[] array = {1, 2, 3};
System.out.println(array[3]); // 数组中只有3个元素,下标一次为:0 1 2,array[3]下标越界
// 执行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100at Test.main(Test.java:4)

抛出了 java.lang.ArrayIndexOutOfBoundsException 异常. 使用数组一定要下标谨防越界.

1.2 数组遍历

“遍历” 是指将数组中的所有元素都访问一遍, 访问是指对数组中的元素进行某种操作,比如:打印。

在数组中可以通过 数组对象.length 的方式来获取数组的长度。

int[] array = new int[] {1,2,3,4,5,6};
//for循环遍历
for (int i = 0; i < array.length; i++) {System.out.print(array[i]+" ");
}
System.out.println();// for-each遍历
for (int x : array) {System.out.print(x+" ");
}
System.out.println();//数组转字符串,将其打印
String string = Arrays.toString(array);
System.out.println(string);

for-each(依次取array的元素,然后自增) 是 for 循环的另外一种使用方式. 能够更方便的完成对数组的遍历. 可以避免循环条件和更新语句写错。

二、JVM的内存布局

内存是一段连续的存储空间,主要用来存储程序运行时数据的。比如:

  1. 程序运行时代码需要加载到内存
  2. 程序运行产生的中间数据要存放在内存
  3. 程序中的常量也要保存
  4. 有些数据可能需要长时间存储,而有些数据当方法运行结束后就要被销毁

如果对内存中存储的数据不加区分的随意存储,那对内存管理起来将会非常麻烦

如下图:

在这里插入图片描述

内存可以想象是你的房间,如果房间里面的东西都是杂乱无章的乱放,等你需要找一件物品的时候,就需要翻遍整个房间。

因此JVM也对所使用的内存按照功能的不同进行了划分:

在这里插入图片描述

  • 程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址
  • 虚拟机栈(JVM Stack): 与方法调用相关的一些信息,每个方法在执行时,都会先创建一个栈帧,栈帧中包含有:局部变量表、操作数栈、动态链接、返回地址以及其他的一些信息,保存的都是与方法执行时相关的一些信息。比如:局部变量。当方法运行结束后,栈帧就被销毁了,即栈帧中保存的数据也被销毁了。
  • 本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的
  • 堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2,3} ),堆是随着程序开始运行时而创建,随着程序的退出而销毁,堆中的数据只要还有在使用,就不会被销毁。
  • 方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据. 方法编译出的的字节码就是保存在这个区域

对于前期的初学者来说不需要关注上述所有,理解堆和虚拟机栈这两块空间就够了。

🌤️全篇总结

数组作为编程中常用的数据结构,具有重要的作用和灵活性,通过掌握数组的使用方法,我们可以高效地处理大量数据。元素访问和数组遍历是数组操作中常见的技巧,能够帮助我们更好地利用数组的功能。此外,了解JVM的内存布局,特别是堆和虚拟机栈的作用,对于理解程序运行时的内存管理至关重要。

在这里插入图片描述

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

相关文章:

  • RabbitMQ消息模型之Simple消息模型
  • 设计模式系列:简单工厂模式
  • 解决 windows+Ubuntu 时间不同步问题
  • Learn SRP 01
  • NL2SQL进阶系列(4):ConvAI、DIN-SQL、C3-浙大、DAIL-SQL-阿里等16个业界开源应用实践详解[Text2SQL]
  • Python统计分析库之statsmodels使用详解
  • A Learning-Based Approach for IP Geolocation(2010年)
  • 高创新 | [24年新算法]NRBO-XGBoost回归+交叉验证基于牛顿拉夫逊优化算法-XGBoost多变量回归预测
  • Web APP设计:将多个相近的机器学习模型融合到一个Web APP中
  • 网络爬虫:定义、应用及法律道德考量
  • (三)ffmpeg 解码流程以及函数介绍
  • go work模块与go mod包管理是的注意事项
  • 华为OD-C卷-最长子字符串的长度(一)[100分]
  • 实战小项目 | ESP32-S3和ESP32-C3通过ESP-Mesh-Lite组网 温湿度传感器案例
  • SiLM5350系列带米勒钳位的单通道隔离驱动器 助力汽车与工业应用实现稳定与高效的解决方案
  • c#中怎么自动下载软件
  • Unity笔记之下拉刷新列表
  • 防火墙操作!
  • 代码随想录算法训练营第四十一天| 343. 整数拆分,96.不同的二叉搜索树
  • 【MATLAB源码-第53期】m代码基于粒子群算法(PSO)的三维路径规划,显示最优路径和适应度曲线。
  • el-table多行合并
  • Vue3 + Element-Plus 使用 Table 插槽时数据未及时更新
  • vue 2 怎么把2024-04-13T17:42:19转换成短日期格式
  • 网络IO模型以及实际应用
  • 一文详解MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM及其关系
  • 《Kubernetes部署篇:基于Kylin V10+ARM架构CPU使用containerd部署K8S 1.26.15集群(一主多从)》
  • maven命令
  • jetson系列开发板使用虚拟机烧录系统时,遇见无法识别开发板的情况
  • 【数据结构】树与二叉树、树与森林部分习题以及算法设计例题 2
  • Cesium之home键开关及相机位置设置