(javaSE)Java数组进阶:数组初始化 数组访问 数组中的jvm 空指针异常

article/2025/8/13 13:52:52

数组的基础

什么是数组呢?
数组指的是一种容器,可以用来存储同种数据类型的多个值

数组的初始化
初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程。
数组初始化的两种方式:静态初始化,动态初始化
数组的静态初始化
初始化:
就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程
完整格式:数据类型[数组名=hew数据类型]{元素1,元素2,元素3..: );
范例:int[]array=newint[]{11,22,33};
编辑
范例:double[]arrav2=new double[]{11.1.22.2.33.3}:

格式:

直接输出:

输出的就是地址值:

其中,[表示这个是个数组,D表示是double的类型的数组,后面的就是相当于是地址值


访问数组:

修改对应的数组值:
//2.把数据存储到数组当中
//格式:数组名[索引]=具体数据/变量;
//细节:一旦覆盖之后,原来的数据就不存在了。
arr[0] = 100;
System.out.println(arr[0]);//100

获取对应的元素值:

结果:

数组的长度获取:

//在Java当中,关于数组的一个长度属性,length
//调用方式:数组名.length

定义一个数组,存储1,2,3,4,5,遍历数组得到每一个元素,求数组里面所有的数据和

定义了一个sum,把值取出来存储在sum里面就可以了

把数组中的值取出来,模3,满足条件--count++

//i表示数组里面的每一个索引
//arr[i]表示数组里面的每一个元素
//3.判断当前的元素是否为3的倍数,如果是那么统计变量最就需要自增一次

变化数据:定义一个数组:存储1,2,3,4,5,6,7,8,9,10,遍历数组得到每一个元素
要求:
1,如果是奇数,则将当前数字扩大两倍
2,如果是偶数,则将当前数字变成二分之一

字符串类型的:


//数组默认初始化值的规律
//整数类型:默认初始化值0
//小数类型:默认初始化值0.0
//字符类型:默认初始化值'/u0000'空格
//布尔类型:默认初始化值false
//引用数据类型:默认初始化值null

//格式:
//数据类型[]数组名=new数据类型[数组的长度];
//在创建的时候,由我们自己指定数组的长度,由虚拟机给出默认的初始化值

当访问了数组中不存在的索引,就会引发索引越界异常。

分析:

每次的max都会被记录,让后面的值与之相比:

//1.定义数组用来存储5个值
int[] arr = {33,5,22,44,55};


//2.定义一个变量max用来存储最大值
//临时认为0索引的数据是最大的
int max=arr[0];


//3.循环获取数组中的每一个元素
//拿着每一个元素跟max进行比较
for(inti=0;i<arr.length;i++){
//i 索引 arr[i] 元素
if(arr[i] > max){
max =arr[i];


//4.当循环结束之后,max记录的就是数组中的最大值
System.out.println(max);//55

进阶

 1.数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的元素
2.下标从0开始,介于[0,N)之间不包含N,N为元素个数又,不能越界,否则会报出下标越界异常。

int[] array = {1, 2, 3};
System.out.println(array[3]);//数组中只有3个元素,下标一次为为:012,array[3]下标越界
//执行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
at Test.main(Test.java:4)

遍历数组的方式:

for-each 是 for 循环的另外一种使用方式. 能够更方便的完成对数组的遍历. 可以避免循环条件和更新语句写错

内存是一段连续的存储空间,主要用来存储程序运行时数据的的。比如:
1.程序运行时代码需要加载到内存
2.程序运行产生的中间数据要存放在内存
3.程序中的常量也要保存
4.有些数据可能需要长时间存储,而有些数据当方法运行结束后就要被销毁

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

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

基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。

在上述代码中,abarr,都是函数内部的变量,因此其空间都在main方法对应的栈帧中分配。
ab是内置类型的变量,因此其空间中保存的就是给该变量初始化的值。
array是数组类型的引用变量,其内部保存的内容可以简单理解成是数组在堆空间中的首地址。
引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该 地址,引用变量便可以去操作对象 有点类似 C语言中的指针,但是Java中引用要比指针的操作更简单。
所有的局部变量存储在栈当中的  局部变量存储在栈当中!!
array这个引用指向了一个数组对象
array[0]=9;通过array这个引用 访问当前的这个对象的0下标
array.length通过array这个引用 访问当前的这个对象的长度

分析

jvm的回收:

如果这个对象一直没有人引用他此时就会被JVM自动回收 

int[] array2=null;
array2这个引用不指向任何对象

null在Java中表示"空引用",也就是一个不指向对象的引用.
int[]arr=null;
System.out.println(arr[0]);
//执行结果
Exception in thread "main"java.lang.NullPointerExceptionat Test.main(Test.java:6)
null的作用类似于C语言中的NULL(空指针),都是表示一个无效的内存位置.因此不能对
作.一旦尝试读写,就会抛出NullPointerException.
注意:Java中并没有约定null和0号地址的内存有任何关联

看一下这两个代码的区别:是不是传引用 就能够 修改实参的值?

这里指向新的对象:

结论:一个引用不可能同时指向多个对象

总结:
1.int[array=null;代表这个引用不指向任何对象
2.array1=array2;代表array1这个引用指向了array2这个引用指向的对象
3.一个引用不可能同时指向2个对象

如何输出二维数组中的结果

二维数组也可以是不规则的:


http://www.hkcw.cn/article/NaUvnEKcbV.shtml

相关文章

Java数据结构——八大排序

排序 插⼊排序希尔排序直接选择排序堆排序冒泡排序快速排序归并排序计数排序 排序的概念 排序&#xff1a;就是将一串东西&#xff0c;按照要求进行排序&#xff0c;按照递增或递减排序起来 稳定性&#xff1a;就是比如排序中有两个相同的数&#xff0c;如果排序后&#xff0c…

【Linux】Linux文件系统详解

目录 Linux系统简介 Linux常见发行版&#xff1a; Linux/windows文件系统区别 Linux文件系统各个目录用途 Linux系统核心文件 系统核心配置文件 用户与环境配置文件 系统运行与日志文件 Linux文件名颜色含义 Linux文件关键信息解析 &#x1f525;个人主页 &#x1f52…

2023年6月6级第一套第一篇

虽然&#xff0c;不重要题干定位到主句信息了&#xff0c;往下走&#xff0c;看强调什么信息看最后一句&#xff0c;优先看主干信息&#xff0c;先找谓语然后找主语和宾语&#xff0c;也是和人有关&#xff0c;后面出现的名词信息是修饰部分&#xff0c;非主干信息不看 A选项&…

Langchaine4j 流式输出 (6)

Langchaine4j 流式输出 大模型的流式输出是指大模型在生成文本或其他类型的数据时&#xff0c;不是等到整个生成过程完成后再一次性 返回所有内容&#xff0c;而是生成一部分就立即发送一部分给用户或下游系统&#xff0c;以逐步、逐块的方式返回结果。 这样&#xff0c;用户…

代谢组数据分析(二十六):LC-MS/MS代谢组学和脂质组学数据的分析流程

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包依赖包安装包加载需要的R包数据下载以及转换mzML数据预处理代谢物注释LipidFinder过滤MultiABLER数据预处理过滤补缺失值对数变换数据标准化下游数据分析总结系统信息参考介…

常量指真,指针常量 ,

const int*p&#xff1b;//const int 值不能变 指向可以变 int *const p&#xff1b;//const p 指向不可以变 值能变

智能指针unique

什么是智能指针&#xff1a; 就像是一个自动管家 帮你管理内存 自动清理不需要的内存 防止内存泄漏 unique_ptr 的特点&#xff1a; 独占所有权&#xff1a;一个资源只能被一个 unique_ptr 管理 不能复制&#xff1a;只能移动 自动释放&#xff1a;当 unique_ptr 被销毁…

并发执行问题 下

这段例子 是让S3 在S2后面运行 写完数据 通知后 另一个进程 竞争使用资源 独占资源 shell解释器 科学语言才有并发语句语言 C语言没有 使用多线程和多进程实现并发运行

[JS逆向] 福建电子交易平台

博客配套代码发布于github&#xff1a;福建电子交易平台 相关知识点&#xff1a;[爬虫知识] 密码学&#xff1a;通往JS逆向路上必会的一环 相关爬虫专栏&#xff1a;JS逆向爬虫实战 爬虫知识点合集 爬虫实战案例 此案例目标为对福建省电子公共服务平台逆向&#xff0c;并爬…

Mask_RCNN 环境配置及训练

目录 一、Mask_RCNN代码及权重 1、源码下载 2、权重获取 二、环境配置 1、创建虚拟环境 2、安装必要的包 三、测试环境 1、使用coco 2、使用balloon 四、测试 1、使用coco 2、使用balloon 一、Mask_RCNN代码及权重 均从github获取&#xff0c;以下是相关链接&#…

72.编辑用户消息功能之前端实现

大体设想 我想实现的一个功能是在用户发出的消息下面有一个图标是编辑&#xff0c;按下那个图标之后&#xff0c;用户可以修改对应的那个消息&#xff0c;修改完成点击确认之后&#xff0c;用户下面对用的那个AI的回答可以重新生成 之前已经介绍了后端实现&#xff0c;这篇博…

第303个Vulnhub靶场演练攻略:Thales1

Thales1 Vulnhub 演练 “Thales”是 Vulnhub 上的夺旗挑战赛。MachineBoy 开发了这款机器&#xff0c;功不可没。https://www.vulnhub.com/entry/thales-1,749/在本教程中&#xff0c;我们将学习如何利用 Tomcat 应用程序管理器实例中的漏洞获取系统访问权限&#xff0c;以及如…

vscode + cmake + ninja+ gcc 搭建MCU开发环境

vscode cmake ninja gcc 搭建MCU开发环境 文章目录 vscode cmake ninja gcc 搭建MCU开发环境1. 前言2. 工具安装及介绍2.1 gcc2.1.1 gcc 介绍2.1.2 gcc 下载及安装 2.2 ninja2.2.1 ninja 介绍2.2 ninja 安装 2.3 cmake2.3.1 cmake 介绍2.3.2 cmake 安装 2.4 VScode 3. 上手…

GNSS终端授时之四:高精度的PTP授时

我们在GNSS终端的授时之三&#xff1a;NTP网络授时中介绍了NTP网络授时的基本原理。我们知道了NTP授时的精度跟网络环境相关&#xff0c;即使在局域网中NTP授时的精度也只能到ms级别。如果广域网&#xff0c;经过多级交换机&#xff0c;路由器&#xff0c;由于传输路径和延时的…

Amazon Augmented AI:人类智慧与AI协作,破解机器学习审核难题

在人工智能日益渗透业务核心的今天&#xff0c;你是否遭遇过这样的困境&#xff1a;自动化AI处理海量数据时&#xff0c;面对模糊、复杂或高风险的场景频频“卡壳”&#xff1f;人工审核团队则被低效、重复的任务压得喘不过气&#xff1f;Amazon Augmented AI (A2I) 的诞生&…

OS10.【Linux】yum命令

目录 1.安装软件的几种方法 直接编译源代码,得到可执行程序 使用软件包管理器 2.yum yum list命令 参数解释 yum install命令 yum remove命令 下载链接存放的位置 扩展yum源 实验:安装sl小火车命令 sl命令的选项 方法1:man sl 方法2:读源代码 3.更新yum源 查看…

网络协议的原理及应用层

网络协议 网络协议目的为了减少通信成本&#xff0c;所有的网络问题都是传输距离变长的问题。 协议的概念&#xff1a;用计算机语言来发出不同的信号&#xff0c;信号代表不同的含义&#xff0c;这就是通信双方的共识&#xff0c;便就是协议。 协议分层&#xff08;语言层和…

【计算机网络】第3章:传输层—可靠数据传输的原理

目录 一、PPT 二、总结 &#xff08;一&#xff09;可靠数据传输原理 关键机制 1. 序号机制 (Sequence Numbers) 2. 确认机制 (Acknowledgements - ACKs) 3. 重传机制 (Retransmission) 4. 校验和 (Checksum) 5. 流量控制 (Flow Control) 协议实现的核心&#xff1a;滑…

RV1126-OPENCV 图像叠加

一.功能介绍 图像叠加&#xff1a;就是在一张图片上放上自己想要的图片&#xff0c;如LOGO&#xff0c;时间等。有点像之前提到的OSD原理一样。例如&#xff1a;下图一张图片&#xff0c;在左上角增加其他图片。 二.OPENCV中图像叠加常用的API 1. copyTo方法进行图像叠加 原理…

Java流【全】

IO流分类 AA、根据数据流动的方向:输入流和输出流 如:打开一个新的记事本并输入一些内容,而这些内容是在内存里面的,没有存储到磁盘中,当点击保存之后,数据才会从内存流向磁盘;当双击打开磁盘文件的时候,数据才会从磁盘流向内存【数据存储有一个特点:内存一旦断电数…