先看代码:
public class Main {
public static void main(String[] args){
int[] arr = new int[3]; //动态初始化,创建3块连续的空间
System.out.println(arr);
}
}
首先说一下栈,堆。栈最典型的特点就是先进先出,在Java程序执行的过程中, .class文件首先被装入内存,栈储存局部变量,即定义在方法声明上和方法中的变量;堆用来储存new出来的数组或对象。此外还有方法区、本地方法区和寄存器等。
上图为上述代码的内存图。
再看以下代码:
public class Main {
public static void main(String[] args){
int[] arr = new int[3]; //动态初始化,创建3块连续的空间
System.out.println(arr);
arr[0] = 10;
arr[1] = 20;
System.out.println(arr[0]);
System.out.println(arr[1]);
}
}
执行结果如下:
在这里,直接打印arr产生的结果 [I@4554617c 表示什么呢?
直接打印数组名,结果为[I@4554617c ,其中[表示数组的维数,有几个就代表几位数组,I表示数组为int型,@是默认的,最后的4554617c代表数组的地址。
内存图如下:
如果定义一个arr2并让他等于arr;那么其实这两个数组引用指向的是同一个内存块,改变其中任意一个,都是对内存块中的数据进行操作。
下图表示新建arr1和arr2两个数组,然后定义arr3=arr2,并对其进行操作:
二维数组的内存图如下:
此外再多说一个知识点:基本数据类型的值传递,不改变原值,因为调用后就会弹栈,局部变量随之消失;引用数据类型的值传递,改变原值,因为即使方法弹栈,但是对内存数组对象还在,可以通过地址继续访问。
Java中到底是传值还是传址?
java中只有传值,因为地址值也是值(出去面试都说这种,支持者是高司令 (Java之父))。