工作三年发现自己连Java数组还没弄明白

数组是大多数编程语言都提供的一种复合结构,如果程序需要多个类型相同的变量时,就可以来考虑定义一个数组。

数组初始化

Java数组的静态特性

Java是典型的静态语言,Java数组也是静态的,当数组被初始化后,该数组的长度是永远不变的。

数组的初始化方式
静态初始化:直接指定数组中各元素的值,由系统确定其长度
动态初始化:指定数组长度,由系统为其分配初始值
--------------->1)若为整数类型(byte、short、int、long),初始化值为0;
--------------->2)若为字符类型(char),初始化值为’\u0000’(空格);
--------------->3)若为布尔类型(boolean),初始化值为false;
--------------->4)若为引用类型(普通Java类、接口、数组),初始化值为null;

上例子!!!
ArrayTest01
下面来分析该程序在内存中的情况
在这里插入图片描述
Java语言的数组变量是引用类型的变量,会存储在各自的方法栈区,而引用类型所引用的对象(数组、普通Java对象)会存储在堆内存中,在Java中,堆内存中的对象不能直接被访问,而是要通过引用变量,也就是说堆内存中存储的一个个值不能被直接拿来用,而是要通过变量引用它也就是赋值给变量才能使用。
有些新手会感觉这样很麻烦,其实不是那样,正是因为这一个个的限制约束极大地保证了Java程序的健壮性、数据完整性!
需要注意的是,Java数组一旦初始化完成,数组元素的内存空间分配就会结束,程序中只能改变数组元素的值,不能改变数组的长度!

那如果是这样呢
在这里插入图片描述
看了它的内部存储你就明白了
其实在执行—>language=str1;<—这个程序时,它就把language的指针指向了str1所引用的值上,其本质上引用的对象值还是没有发生改变,稍后废弃在堆内存中的无用的值会被Java的垃圾回收机制给处理掉。懂了吗,懂就点个赞哦哈哈
在这里插入图片描述

基本数据类型的初始化

对于基本数据类型而言,数组元素的值直接存储在相应的数组元素中。程序先为数组分配内存空间,再将数组元素的值存入对应内存中。
例子例子我要例子!!!
在这里插入图片描述
在这里插入图片描述
当执行—>int[] array=null;<—时,会在main方法栈区里定义一个array的变量,它是一个引用类型的变量,并未指向任何有效的内存,没有真正指向实际的数组对象,此时不能访问array的属性和方法(没有指向实际对象而去访问会报空指针异常,即java.lang.NullPointerException),但程序可以使用此变量不会报错 。
在这里插入图片描述
综上,我们定义一个数组变量后,一定要为其指向一个实际对象,也就是我们通常所说的“Java数组使用之前必须先初始化数组”!
像上文我们使用–>language=str1;<—也是可以的,因为str1初始化了,我将这种方式称之为**“数组代理初始化”**。

引用类型的初始化

当程序中需要多个简单的(像基本数据类型)相同的变量时,我们可以使用基本数据类型的数组;
如果我们需要更加复杂点的(像普通的Java类)多个变量时呢,我们就可以使用引用类型的数组。
引用类型数组的数组元素依然是引用类型的,因此数组元素里存储的还是引用,它指向另一块内存,这块内存里存储了该引用变量所引用的对象(包括数组和Java对象)。
上例子!!!
在这里插入图片描述
在这里插入图片描述
students是引用类型的数组,so->students[0]和students[1]两个数组元素相当于两个引用类型的变量,接着定义了两个Student类的实例化对象xiaoMing和xiaoHong,数组指针指向这两个对象,也就是赋值操作。对于Student[]类型的数组而言,它的每一个数组元素都相当于一个Student类型的变量,因此它的数组元素只能指向Student类对象。
内存图如下:
在这里插入图片描述

多维数组的使用

我们通常使用的都是普通的简单的数组,即一个数组元素只存储一个元素,如果一个数组元素里可以再存储一个数组的话,就形成了多维数组。就是数组里还有数组,一个数组元素里若有一个数组的话就组成了2维数组,有两个数组就组成了3维数组…以此类推。
我们就以2维数组来进行分析,相同的思路就可以推出多维数组的使用了哈。

int[]:一维数组
int[][]:二维数组

以此类推

来个更直观点的图!!!(纯手绘,没得毛病)
在这里插入图片描述
Java允许将多维数组当成一维数组处理。初始化多维数组时可以只先初始化最左边的维数。
上例子!!!
在这里插入图片描述
在这里插入图片描述

完结撒花

结束啦,复习一下,本次学习呢,首先搞明白了什么是数组,数组的静态特性,即数组长度一经初始化不能改变,两种初始化数组的方法:静态初始化和动态初始化,还有其分配内存的小小细节啦,看我画的图,清晰得不得了!又举了两种不同类型数组的例子,一个是基本类型的数组,另一个是引用类型的数组。在引用类型里介绍了数组变量和实际变量的不同及其关系,数组变量指针指向实际变量,一定要清楚哈,不清楚的话再去看一遍喽,最后呢,说了多维数组的骚操作——数组嵌套数组,还有一张非常清楚的多维数组直观图,一定要好好研究下哈,把握好一维数组与多维数组的关系,就到这里啦,放假了哈哈,终于有时间来更新我的博客啦,学会了就给UP主点个关注吧哈哈,那就下次见喽!!!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值