一、数组内存地址含义
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数组的值也会变化