数组在计算机中的执行原理
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虚拟机中执行的。
Java为了便于虚拟机执行Java程序,将虚拟机的内存划分为 方法区、栈、堆、本地方法栈、寄存器 这5块区域。需要重点关注的是 方法区、栈、堆。下面把每一个块内存区域作用介绍一下。
-
方法区:字节码文件先加载到这里
-
Random rand = new Random(); Scanner sc = new Scanner(System.in);
-
栈:方法运行时所进入的内存区域,由于变量在方法中,所以变量也在这一块区域中
-
堆:存储new出来的东西,并分配地址。由于数组是new 出来的,所以数组也在这块区域。
下面是上面案例执行的内存原理如下图所示,按照① ② ③ ④ ⑤ ⑥ 的标记的顺序来看。
总结一下 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);
}
}
刚执行完 int[] arr1 = {11,22,33}; 时,内存原理如下
当执行完 int[] arr2 = arr1; 后,内存原理如下
当执行到 arr2[1]=99;时 ,内存原理如下
总结一下:
- 两个变量指向同一个数组时,两个变量记录的是同一个地址值。
1]=99;时 ,内存原理如下**
[外链图片转存中…(img-VW4ygf4T-1691944224489)]
总结一下:
- 两个变量指向同一个数组时,两个变量记录的是同一个地址值。
- 当一个变量修改数组中的元素时,另一个变量去访问数组中的元素,元素已经被修改过了