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

数组的基础

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

数组的初始化
初始化:就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程。
数组初始化的两种方式:静态初始化,动态初始化
数组的静态初始化
初始化:
就是在内存中,为数组容器开辟空间,并将数据存入容器中的过程
完整格式:数据类型[数组名=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.pswp.cn/news/907872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

支持向量机(SVM)例题

对于图中所示的线性可分的20个样本数据&#xff0c;利用支持向量机进行预测分类&#xff0c;有三个支持向量 A ( 0 , 2 ) A\left(0, 2\right) A(0,2)、 B ( 2 , 0 ) B\left(2, 0\right) B(2,0) 和 C ( − 1 , − 1 ) C\left(-1, -1\right) C(−1,−1)。 求支持向量机分类器的线…

UE特效Niagara性能分析

开启Niagara调试器 开启显示概览 界面显示 &#x1f7e9; 上方绿色面板&#xff1a;Niagara DebugHud 这是 HUD&#xff08;调试视图&#xff09; 模式下的性能统计显示&#xff0c;内容如下&#xff1a; 项目含义SystemFilter: ShockWave_01当前选中的 Niagara 粒子系统名称…

碳中和新路径:铁电液晶屏如何破解高性能与节能矛盾?

一、显示技术困局&#xff1a;当 “高刷” 遭遇 “高耗” 在元宇宙、电竞产业蓬勃发展的当下&#xff0c;显示设备的刷新率与能耗成为行业痛点。传统液晶受 “边缘场效应” 制约&#xff0c;刷新率长期停滞在 300Hz 以下&#xff0c;动态画面拖影问题显著&#xff1b;同时&…

Vue3+SpringBoot全栈开发:从零实现增删改查与分页功能

前言 在现代化Web应用开发中&#xff0c;前后端分离架构已成为主流。本文将详细介绍如何使用Vue3作为前端框架&#xff0c;SpringBoot作为后端框架&#xff0c;实现一套完整的增删改查(CRUD)功能&#xff0c;包含分页查询、条件筛选等企业级特性。 技术栈介绍 前端&#xff1…

IBM 与嘉士伯(Carlsberg)携手推进 SAP S/4HANA 数字化转型,打造啤酒行业新范式

在啤酒酿造拥有悠久传统的同时&#xff0c;嘉士伯也在积极拥抱前沿技术&#xff0c;迈出数字化转型的坚实步伐。2025年&#xff0c;嘉士伯宣布与 IBM 建立多年的合作伙伴关系&#xff0c;在其西欧业务中全面部署 SAP S/4HANA&#xff0c;旨在提升企业的运营效率、敏捷性和创新能…

深度解析 Nginx 配置:从性能优化到 HTTPS 安全实践

引言 Nginx 作为高性能的 Web 服务器和反向代理&#xff0c;其配置灵活性和强大功能备受开发者青睐。本文基于一份生产环境的 Nginx 配置文件&#xff0c;详细拆解其核心配置逻辑&#xff0c;涵盖性能优化、HTTPS 安全配置、反向代理及静态资源处理等关键环节&#xff0c;帮助…

传送文件利器wormhole的使用方法

传送文件利器wormhole的使用方法 wormhole文件传送工具是基于python的一个快捷的传送工具&#xff0c;在安装此工具之前首先要部署好python环境。 安装的过程如下&#xff1a; 1.部署好python 环境 LINUX系统自带PYTHON环境&#xff0c;直接安装即可。 WINDOWS系统需要安装py…

LangChain输出格式化实践:提升测试工程师LLM开发效率的完整指南

引言 在基于LangChain的LLM测试开发中&#xff0c;输出格式化是连接大模型推理能力与自动化测试系统的关键环节。通过结构化输出&#xff08;如JSON&#xff09;&#xff0c;测试工程师可快速将LLM生成的测试用例、缺陷报告等结果对接至CI/CD流水线。本文系统解析LangChain内置…

Go 语言 + Word 文档模板:WordZero 引擎如何让企业文档处理效率提升 300%?

前言 在企业级应用开发中&#xff0c;自动化生成Word文档一直是个令人头疼的需求。传统的方案要么依赖于复杂的Office COM组件&#xff0c;要么使用功能有限的第三方库。今天为大家介绍一个纯Go语言实现的Word操作库——WordZero&#xff0c;特别是其强大的模板引擎功能&#…

Eclipse 修改字符集

Eclipse 修改字符集 在软件开发过程中,字符集的设置对于代码的正确显示和运行至关重要。Eclipse 作为一款流行的集成开发环境(IDE),提供了方便的字符集修改功能。本文将详细讲解如何在 Eclipse 中修改字符集,以确保项目文件的正确处理。 1. 引言 在 Java 开发中,常见的…

C++ 游戏开发详细流程

&#x1f9e0; 第一阶段&#xff1a;项目规划与架构设计 关键词&#xff1a;系统性、模块化、可扩展性 1.1 目标明确 游戏类型&#xff1a;2D / 2.5D / 3D / VR平台选择&#xff1a;PC、主机、移动设备多人/单人&#xff1a;是否含网络模块&#xff08;决定是否使用 socket、U…

使用Docker-NVIDIA-GPU开发配置:解决 Docker NVIDIA 运行时错误方法

问题描述 运行 Docker 命令时,系统提示 docker: Error response from daemon: unknown or invalid runtime name: nvidia,表明 Docker 无法识别 NVIDIA 运行时。这一错误通常出现在使用 --runtime=nvidia 和 --gpus 参数时,意味着 NVIDIA 容器运行时未正确安装或配置。NVID…

3516cv610在sample_aiisp上多创一路编码流,方法

3516cv610在sample_aiisp上多创一路编码流&#xff0c;方法 首先确保 vpss grp0有视频流 最好保证 已经有一路视频流能推出来 多创一路编码流思路为 将 vpss grp0又绑定给 vpss_chn1 vpss_chn1有绑定给 venc_chn1 这样我们就多创了一路视频流。 这里思路完全正确 可以实现…

【烧脑算法】不定长滑动窗口:从动态调整到精准匹配以灵活特性实现高效破题

目录 求最长/最大 2730. 找到最长的半重复子字符串 2779. 数组的最大美丽值 1838. 最高频元素的频数 2516. 每种字符至少取 K 个 2831. 找出最长等值子数组 求最短/最小 1234. 替换子串得到平衡字符串 2875. 无限数组的最短子数组 76. 最小覆盖子串 632. 最小区间 …

第七十篇 从餐厅后厨到电影院选座:生活场景拆解Java并发编程核心

目录 一、并发基础&#xff1a;餐厅后厨的协作艺术1.1 厨师与线程&#xff08;Thread&#xff09;1.2 共享资源竞争&#xff1a;唯一的炒锅1.3 线程状态转换&#xff1a;厨师工作流 二、线程同步&#xff1a;电影院选座中的锁机制2.1 同步锁&#xff08;synchronized&#xff0…

嵌入式学习--江协stm32day1

失踪人口回归了&#xff0c;stm32的学习比起51要慢一些&#xff0c;因为涉及插线&#xff0c;可能存在漏插&#xff0c;不牢固等问题。 相对于51直接对寄存器的设置&#xff0c;stm32因为是32位修改起来比较麻烦&#xff0c;江协课程是基于标准库的&#xff0c;是对封装函数进…

vue+elementUi+axios实现分页(MyBatis、Servlet)

vueelementUiaxios实现分页 文章目录 vueelementUiaxios实现分页1.代码实现【HTML】**【Servlet层】****【Service层】****【Dao层】** 2.总结步骤3.实现要点4.注意事项4.注意事项 注&#xff1a;此项目 前端为 html、 后端采用 mybatis、servlet实现 1.代码实现 【HTML】…

vue-10( 动态路由匹配和路由参数)

动态路由匹配和路由参数 动态路由匹配是 Vue Router 的一个强大功能&#xff0c;它允许你创建灵活且可重用的路由。您可以使用参数来捕获 URL 的动态段&#xff0c;而不是为每个可能的值定义特定路由。这在处理具有唯一标识符的资源&#xff08;如用户配置文件、产品详细信息或…

劫持进程注入

劫持进程注入和远程线程注入的区别就是 远程线程注入是向一个正在运行中的进程注入 而劫持进程注入则是自己打开一个进程(以挂起的方式) 然后再进行注入的操作 这样做的原因是当进程在挂起的状态时他的所有线程都是处于未启用的阶段 这样就可以避免目标进程的反注入线程的…

uni-app学习笔记二十--pages.json页面路由pages设置

uni-app 通过 pages 节点配置应用由哪些页面组成&#xff0c;pages 节点接收一个数组&#xff0c;数组每个项都是一个对象&#xff0c;其属性值如下&#xff1a; 属性类型默认值描述pathString配置页面路径styleObject配置页面窗口表现&#xff0c;配置项参考下方 pageStylene…