(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也对所使用的内存按照功能的不同进行了划分:
基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。
在上述代码中,a、b、arr,都是函数内部的变量,因此其空间都在main方法对应的栈帧中分配。a、b是内置类型的变量,因此其空间中保存的就是给该变量初始化的值。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个对象如何输出二维数组中的结果
二维数组也可以是不规则的: