目录
一.Java中数组的内存分配
1.基本内存分配概念
区域名称 | 作用 |
寄存器 | 给CPU使用,和我们开发无关 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关 |
方法区 | 存储可以运行的class文件 |
堆内存 | 存储对象或者数组,new来创建的,都存储在堆内存 |
方法栈 | 方法运行时使用的内存,且存储局部变量。main方法运行,进入方法栈执行 |
2.动态初始化内存图解
int[] arr = new int[3]; System.out.println(arr);//[I@10f87f48 System.out.println(arr[0]);//0 System.out.println(arr[1]);//0 System.out.println(arr[2]);//0
int[] arr存放在堆内存,new int[3]存放在栈内存。
在堆内存中每一个new出来的对象都有一个唯一的地址值,就像[I@10f87f48。int[] arr = new int[3]就相当于把堆内存的地址值[I@10f87f48赋值给栈内存的数组;System.out.println(arr)则会打印地址值。
堆内存每一个对象的数据类型在没有赋值的情况下都有默认值。当执行打印语句时:
System.out.println(arr[0]);//0
System.out.println(arr[1]);//0
System.out.println(arr[2]);//0
就会打印出0。
栈内存通过地址值[I@10f87f48找到堆内存对应的[I@10f87f48地址值,通过索引找到相应的值。
3.静态初始化内存图解
int[] arr = new int[]{1,2,3}; System.out.println(arr);//[I@10f87f48 System.out.println(arr[0]);//1 System.out.println(arr[1]);//2 System.out.println(arr[2]);//3
当静态初始化时,会有默认值,从而对数组进行赋值,默认值将被覆盖。
4.两个数组的内存图
int[] arr1 = new int[2]; int[] arr2 = new int[3]; System.out.println(arr1);//[I@10f87f48 System.out.println(arr1[0]);//0 System.out.println(arr1[1]);//0 System.out.println(arr2);//[I@b4c966a System.out.println(arr2[0]);//0 System.out.println(arr2[1]);//0 System.out.println(arr2[2]);//0 arr1[0] = 5; arr2[1] = 10; arr2[2] = 20; System.out.println(arr1);//[I@10f87f48 System.out.println(arr1[0]);//5 System.out.println(arr1[1]);//0 System.out.println(arr2);//[I@b4c966a System.out.println(arr2[0]);//0 System.out.println(arr2[1]);//10 System.out.println(arr2[2]);//20
动态初始化arr1和arr2,在堆内存中开辟新的空间,通过不同的地址值,对默认值进行赋值。
5.两个数组指向同一个地址值内存图
int[] arr1 = new int[2]; arr1[0] = 15; arr1[1] = 30; System.out.println(arr1);//[I@10f87f48 System.out.println(arr1[0]);//15 System.out.println(arr1[1]);//30 int[] arr2 = arr1; arr2[0] = 50; arr2[1] = 40; System.out.println(arr1);//[I@10f87f48 System.out.println(arr1[0]);//50 System.out.println(arr1[1]);//40 System.out.println(arr2);//[I@10f87f48 System.out.println(arr2[0]);//50 System.out.println(arr2[1]);//40
初始化arr1,之后进行赋值操作,则结果为15,30;
定义数组arr2,把第一个数组arr1的地址值赋给第二个数组,数组arr2会根据地址值找到堆内存中数组arr1的地址,进而对其进行赋值,覆盖了数组arr1的数值,结果为50,40。