数组在计算机中的执行原理

数组在计算机中的执行原理

1.数组的执行原理,Java程序的执行原理

我们以下面的代码,来理解变量、数组的执行原理。

public class ArrayDemo1 {
	public static void main(String[] args) {
        int a = 10;
 		System.out.println(a); // 10
 		int[] arr = new int[]{11, 22, 33}; // 静态初始化
 		System.out.println(arr); // 地址
 		System.out.println(arr[1]); // 22
 		arr[0] = 44;
 		arr[1] = 55;
 		arr[2] = 66;
 		System.out.println(arr[0]); // 44
 		System.out.println(arr[1]); // 55
 		System.out.println(arr[2]); // 66
	}
}

程序是在内存中执行的,实际上Java程序是把编译后的字节码加载到Java虚拟机中执行的。

image-20230813194758862

Java为了便于虚拟机执行Java程序,将虚拟机的内存划分为 方法区、栈、堆、本地方法栈、寄存器 这5块区域。需要重点关注的是 方法区、栈、堆。下面把每一个块内存区域作用介绍一下。

  • 方法区:字节码文件先加载到这里

  • Random rand = new Random();
    Scanner sc = new Scanner(System.in);
    
  • 栈:方法运行时所进入的内存区域,由于变量在方法中,所以变量也在这一块区域中

  • 堆:存储new出来的东西,并分配地址。由于数组是new 出来的,所以数组也在这块区域。

下面是上面案例执行的内存原理如下图所示,按照① ② ③ ④ ⑤ ⑥ 的标记的顺序来看。

image-20230813195114309

总结一下 int a = 10 与 int[] arr = new int[]{11,22,33}的区别

  • a是一个变量,在栈内存中,a变量中存储的数据就是10这个值
  • arr也是一个变量,在栈中,存储的是数组对象在堆内存中的地址值
// 这里的int a是一个基本类型变量,存储的是一个数值
int a = 10 ;
//这里的int[] arr是一个引用类型的变量,存储的是一个地址值
int[] arr = new int[]{44,55,66};

2.多个变量指向同一个数组的问题

了解了数组在内存中的执行原理。我们知道数组类型的变量,指向的是堆内存中数组对象的地址。但是在实际开发中可能存在一种特殊情况,就是多个变量指向同一个数组对象的形式。

讲解这个知识点的目的,是要让大家注意多个变量指向同一个数组对象存在什么问题?

我们先看一段代码

public class ArrayDemo2 {
	public static void main(String[] args) {
    	// 目标:认识多个变量指向同一个数组对象的形式,并掌握其注意事项。
		int[] arr1 = new int[]{11, 22, 33};
		// 把int类型的数组变量arr1赋值给int类型的数组变量arr2
		int[] arr2 = arr1;
	 	int[] arr3 = new int[]{11, 22, 33};
		System.out.println(arr1); // 地址
		System.out.println(arr2); // 地址 1 == 2 都不一样
		System.out.println(arr3); // 地址 3 不一样
		arr2[1] = 99;
		System.out.println(arr1[1]);//99
		arr2 = null; // 拿到的数组变量中存储的值是null
		System.out.println(arr2);
		//System.out.println(arr2[0]);
		//System.out.println(arr2.length);
	}
}

image-20230813195810914

image-20230813195955232

刚执行完 int[] arr1 = {11,22,33}; 时,内存原理如下

image-20230813200446212

当执行完 int[] arr2 = arr1; 后,内存原理如下

image-20230813200632458

当执行到 arr2[1]=99;时 ,内存原理如下

image-20230813200703515

总结一下:

  • 两个变量指向同一个数组时,两个变量记录的是同一个地址值。
    1]=99;时 ,内存原理如下**

[外链图片转存中…(img-VW4ygf4T-1691944224489)]

总结一下:

  • 两个变量指向同一个数组时,两个变量记录的是同一个地址值。
  • 当一个变量修改数组中的元素时,另一个变量去访问数组中的元素,元素已经被修改过了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值