变量与数组存储方式比较

定义变量

int a = 10;
int b = a;

b = 20;
System.out.println("a = " + a); // a = 10
a = 30;
System.out.println("b = " + b); // b = 20

在定义变量后,将一个变量赋值给另一个变量时,在内存中的存储方式为:

int a;
int b;
定义变量a,b后,他们在栈中存储的方式如下,a,b存储的位置是系统随机分配的,可能是不连续的空间。

在这里插入图片描述

int b = a;
将a中的值10赋值给b。此时在a和b中都有值。
若改变a的值,将不会影响b的值,改变b的值也不会影响a的值

在这里插入图片描述

定义数组

int[] arr = new int[]{
    
    10,20,30};
int[] brr = arr;


brr[0] = 20;
System.out.println("a = " + arr[0]); // arr[0] = 20
arr[0] = 30;
System.out.println("b = " + brr[0]); // brr[0] = 30

在定义一个数组时,new在堆中开辟内存空间,系统会在栈中声明一个数组名,同时在堆中开辟一块内存空间来存放数组,将首元素的地址存放在数组名中。
在这里插入图片描述

int[] brr = arr;
因为brr没有new创建新的对象,而只是将arr变量名中存放的地址赋值给brr,这样,brr中就存放与arr相同的地址。所以此时修改arr中的值时,brr中的值也会修改。反之亦然。

在这里插入图片描述

定义二维数组

数据类型[][] 数组名 = new 数据类型[m][n];

	m:表示这个二维数组有多少个一维数组。
	n:表示每一个一维数组的元素有多少个。

例如:

int arr[][]=new int[3][2];

在这里插入图片描述

总结:
1、栈:程序运行,堆:数据存储
2、栈存储方法调用时产生的局部变量(如 8种基本数据类型byte、boolean、char、short、int、long、float、double,以及 对象引用地址), 而堆存储对象的实例(使用new创建的对象实例)
3、栈没有 GC, 而堆有 GC(GC的全称是garbage collection,垃圾回收)
4、栈是不同线程间是隔离的, 而堆是共享的

猜你喜欢

转载自blog.csdn.net/qq_38705144/article/details/109442569
今日推荐