关于数组引用的详细介绍

一、数组内存地址含义

public class ArrayAddress {
    public static void main(String[] args) {
        int a[] = {1,2,3,4};
        System.out.println(a);
    }
}

结果:

[I@15db9742

分析:"["表示数组,''I''表示数组中变量类型,"15db9742"表示内存地址,"@"用于分割类型与地址。

补充:“[[”表示二维数组

二、数组类型的引用

重所周知,数组类型是引用类型,在栈里存放着数组的首地址,在堆里存放着数据开辟的内存单元

public class ArrayDemo1 {
    public static void main(String[] args) {
        int[] array = new int[3];
        array[0] = 1;
        array[1] = 2;
        for (int i : array) {
            System.out.println(i);
        }
    }
}

接下来看图说话

首先,看见“new”关键字,我们就知道,jvm会为我们在堆里开辟内存单元,(看见new关键字,那么它就被安排在了堆里),

接着看见 int[3],jvm为我们开辟三个单元,并为它们附上初始值“0”(因为变量类型为int型),补充:(byte/short/int 是 0 ,long为0L ,float 为0.0f ,double 为 0.0 ,boolean 为 false,char为/u000)

其次,看见 int[] array,申明一个局部变量,将他放在栈里,方便调用。

补充:引用类型数据(除String),他们的地址放在栈里,值放在堆里。(String类型数据放在方法区的常量池中)

紧接着,看见“=”,好的,看见它,我们就明白它会和 new int[3] 关联。没错,array将要获得该数组在堆里的首地址。

最后,为array[0], array[1]赋值,通过array,找到堆里的首地址,然后通过索引,进行修改数组的值。

三、数组引用进阶

public class ArrayDemo2 {
    public static void main(String[] args) {
        int[] array = new int[3];
        array[0] = 1;
        array[1] = 2;
        array[2] = 3;
        
        int[] array2 = array;
        array2[0] = 4;
        array2[1] = 5;
        array2[2] = 6;
        
        for (int i : array) {
            System.out.println(i);
        }
    }
}
 

运行结果:

4
5
6

接着看图说话:

(1)首先实例化对象,在堆里开辟单元,并为赋上默认值

(2)通过首地址,找到内存单元,然后,根据索引,为它赋值

(3)申明array2,并将array的首地址赋值给array2

(4)然后通过首地址,找到内存单元,然后,根据索引,修改值

(5)所以array数组的值也会变化

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值