java数组回收_Java数组深入

Java数组深入

内存中的数组

前边提到:数组是一种引用类型,数组引用变量只是一个引用,当它指向有效内存的时候才可以通过数组变量来访问数组元素,也就是说数组变量和数组元素在内存中是分开放的。

可以这么理解,一个人名就是一个引用变量,通过这个人名找到这个人,获取他的所有信息,就是通过引用变量访问其真实对象的过程。

例如数组int[]arr中arr是一个数组引用变量,但他并没有初始化,也就是说没有指向一块内存,所以它并不能被使用。int[]arr = new int[3]; 而这个语句则明确申请了一块三个int(12个字节)空间的内存,并让arr这个数组引用变量去指向他,以此来访问实际的数组对象。

那么,这两个东西在内存中具体在哪呢?

实际的数组对象被存在堆(heap)内存中。

数组引用变量如果是局部变量,就被存在栈(stack)内存中。

Java中的堆和栈

所有的方法中定义的局部变量都会逐个放入栈内存中,方法结束,栈内存就会销毁。

而每创建一个对象,就会被保存到堆内存中,以便反复利用,即运行时数据区,不会随方法的结束销毁,意味着,方法结束后,还可能有另一个引用变量正在指向它。注意:只有当一个对象没有任何引用变量引用它时,才会变成垃圾,被系统的垃圾回收器自动回收。

所以:想要让一个数组彻底变成“垃圾”,直接将数组变量赋值null。

如下:

int[]arr = new int[3];

arr = null;

arr[1]=0;//java.lang.NullPointerException

具体关于Java中的垃圾回收机制,以后再具体的进行总结,待补充。。

基本类型初始化

前边也提到,数组如果没有进行初始化,是不能够使用它的,那么初始化的过程在内存中又是如何体现的呢,基本类型的初始化和引用类型的初始化又有何不同呢。

对于基本数组而言,数组元素的值直接存储在对应的数组元素中。所以初始化数组时,先为数组分配内存空间,然后直接把数组元素的值放到对应的位置上。

public class Test1

{

public static void main(String[] args)

{

//定义一个int[]类型的数组变量

int[] arr;

//动态初始化数组,整型默认为0

arr = new int[4];

//利用for循环给数组每个元素赋值

for(int i = 0;i

//打印显示数组结果

for(int i:arr) System.out.print(i+" ");//0 1 2 3

}

}

定义数组变量

a39bc5fdb11ee25967587323b1393baa.png

动态初始化

196c9b5ef19f0ad1e0bc2dea2929ad1f.png

赋值

057d3b21eaaf7b715921bffaa15b80dd.png

引用类型数组的初始化

欸,数组本身就是引用类型,创建的数组元素又是引用类型,数组元素还指着另外一块内存,那里才装着有效数据。

我们知道,类是引用类型的其中一种,所以下面通过建立一个全是类的数组,关于数组,应该很快就要开始学习并总结啦,所以这块还是先肤浅地谈一谈,有待补充。

class Hero

{

public int defenseVal;

public int attackVal;

}

public class Test

{

public static void main(String[] args)

{

//定义一个students数组变量,其类型是Hero[]

Hero[] heros;

//动态初始化

heros = new Hero[2];

//创建一个Hero实例,并让Zed变量指向该实例

Hero Zed = new Hero();

//为Zed赋攻击力和防御力属性

Zed.attackVal = 95;

Zed.defenseVal = 5;

//让数组的第一个元素指向实例Zed

heros[0]=Zed;

//发现Zed和heros[0]指向同一片内存。

System.out.println(heros[0].attackVal==Zed.attackVal);

}

}

定义数组变量

ae67b4a2ce8c37a9b4d477cd32a00aba.png

动态初始化

ffd766d01d8d0f9823a14bd10d047eb6.png

创建实例

09b7639bbdbb454ad571c3f95702e5f0.png

赋值

ffd01fa90d30d3c17f7cc093129fc574.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值