一、Javaの五大内存分配地:
- 栈
- 堆
- 方法区
- 本地方法栈
- 寄存器
我们主要掌握栈和堆的分配规则。
举个例子:
public static void main(String[] args) {
int a = 5;
int b = 10;
int c = a + b;
sout(c);
}
现在分析栈和堆中的内存分配。(由于没有new什么东西,所以不需要考虑堆内存)
栈中的内存分配情况为:
【说明】
1. 首先main函数先入栈
2. int a 表示在栈中分配一块int大小的内存,名字叫a。a=5表示内存中存放的值为5。
3. b同理。
4. int c = a+b; 首先分别要到a、b内存中去取出数字5和数字10,将其相加,相加后的结果存放在内存c中。
二、数组的内存图
1.代码
public static void main(String[] args) {
int[] arr1 = new int[2];
System.out.println(arr1);
System.out.println(arr1[0]);
System.out.println(arr1[1]);
arr1[0]=11;
arr1[1]=12;
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println("----------------------");
int[] arr2 ={33,44,55};
System.out.println(arr2);
System.out.println(arr2[0]);
System.out.println(arr2[1]);
}
2.栈和堆中内存分配情况:
【说明】
1. int[ ] arr1在栈里面定义了一个变量,变量的名字叫arr,类型int。
2. new int[2];在堆里面开辟了一个小空间,长度为2,索引为0、1。
3. 通过 “=” 将这个小空间的地址值赋值给arr,而arr通过地址值也能找到该小空间。
4. arr1[0]
5. arr2数组同理。
总结:
1. 只要是new出来的一定是在堆中开辟了一个小空间。
2. 如果new出现了很多次,那么堆里面有很多个小空间,每个小空间中彼此独立。
三、两个数组指向同一个空间的内存图
1.代码
psvm(){
int[] arr1 = {11,22};
int[] arr2 = arr1;
sout(arr1[0]);
sout(arr2[0]);
arr2[0] = 33;
sout(arr1[0]);
sout(arr2[0]);
}
2.运行结果:
3.栈和堆的内存分配情况:
【说明】
1. main方法进栈。
2. 在栈中定义arr1,在堆中开辟一个空间,里面存储11,22。再把空间的地址赋值给arr1,arr1可以通过地址找到该空间。
3. 在栈中定义arr2,把arr1所记录的内容赋值给了arr2,即把arr1的堆空间的地址赋给了arr2。所以arr1和arr2指向同一个堆空间。
4. arr2[0]=33; 将该地址空间的数组中索引为0的元素赋值为33。
5. arr1[0]和arr2[0]的值都变成了33。
总结:当两个数组指向同一个堆空间时,如果其中一个数组对空间内的值进行赋值,那么另一个数组再次访问该空间,就是赋值后的结果了。