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

(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个对象

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

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

相关文章:

  • DAY 35 超大力王爱学Python
  • 【AI学习】检索增强生成(Retrieval Augmented Generation,RAG)
  • yolo个人深入理解
  • PINN模型相关原理
  • rtpmixsound:实现音频混音攻击!全参数详细教程!Kali Linux教程!
  • 主数据编码体系全景解析:从基础到高级的编码策略全指南
  • Python数学可视化——环境搭建与基础绘图
  • python汉语编程,将关键字与文言文对应
  • 源码解析(二):nnUNet
  • 03.MySQL表的操作详解
  • K3s简介、实战、问题记录
  • Java高效处理大文件:避免OOM的深度实践
  • 【STM32F1标准库】理论——外部中断
  • 用提示词写程序(3),VSCODE+Claude3.5+deepseek开发edge扩展插件V2
  • 纯汇编自制操作系统(四、应用程序等的实现)
  • vue3(入门,setup,ref,计算属性,watch)
  • 财管5-投资项目的评价指标现金流量构成
  • C# 类和继承(构造函数的执行)
  • Spring Ai 从Demo到搭建套壳项目(一)初识与实现与deepseek对话模式
  • YOLOv5-入门篇笔记
  • 中国建设银网站/免费发布网站seo外链
  • 做外贸如何浏览国外网站/优化师助理
  • 企业 宣传 还要网站吗/成人大专
  • 织梦音乐网站程序/百度账号怎么改名字
  • 网站开发需要大学吗/aso优化app推广
  • 厚街网站仿做/云优客seo排名公司