Java基础学习笔记 - Day05 - 第二章 数组原理内存图
Java基础学习笔记 - Day05 - 第二章 数组原理内存图
系统:Win10
JDK:1.8.0_121
IDE:IntelliJ IDEA 2017.3.7
2.1 内存概述
内存是计算机中的重要元件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存才能运行,运行完毕后会清空内存
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理
2.2 Java虚拟机的内存划分
为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的数据处理方式和内存管理方式
- JVM的内存划分:
区域名称 | 作用 |
---|---|
Java 栈 VM Stack | 方法运行时使用的内存,比如main方法的执行,进入方法栈中执行 |
堆 Heap | 存储对象或者数组;new创建的都存储在堆内存 |
方法区 Method Area | 存储可以运行的class文件 |
本地方法栈 Native Method Stack | JVM在使用操作系统功能的时候使用,和开发无关 |
寄存器 Program Counter Register | CPU使用,和开发无关 |
堆内存里面的东西都有一个地址值:16进制的
堆内存里面的数据,都有默认值。规则:
- 如果是整数 默认为 0
- 如果是浮点数 默认为 0.0
- 如果是字符 默认为 \u0000
- 如果是布尔值 默认为 false
- 如果是引用类型 默认为 null
2.3 数组在内存中的存储
一个数组内存图
public class ArrayOneDemo01 {
public static void main(String[] args) {
int[] arrayA = new int[3];
System.out.println(arrayA); // 地址值
System.out.println("====================");
System.out.println(arrayA[0]); // 0
System.out.println(arrayA[1]); // 0
System.out.println(arrayA[2]); // 0
arrayA[1] = 10;
arrayA[2] = 20;
System.out.println("====================");
System.out.println(arrayA[0]); // 0
System.out.println(arrayA[1]); // 10
System.out.println(arrayA[2]); // 20
}
}
程序执行流程:
- ArrayOneDemo01.class 文件进入方法区
- main方法进入方法栈执行
- 创建数组,JVM会在堆内存中开辟空间,存储数组
- 数组在内存中会有自己的内存地址,以16进制表示(前面加 0x )
- 数组中有3个元素,默认值为0
- JVM将数组的内存地址赋值给引用类型变量arrayA
- 变量arrayA存储的数组内存中的地址(经过变换的值),而不是一个具体的数值,因此成为引用数据类型
两个数组内存图
public class ArrayTwoDemo01 {
public static void main(String[] args) {
int[] arrayA = new int[3];
int[] arrayB = new int[4];
System.out.println(arrayA);
System.out.println(arrayB);
}
}
两个引用指向一个数组
public class ArraySameDemo01 {
public static void main(String[] args) {
int[] arrayA = new int[3];
System.out.println(arrayA); // 地址值1
arrayA[1] = 10;
arrayA[2] = 20;
System.out.println(arrayA[0]); // 0
System.out.println(arrayA[1]); // 10
System.out.println(arrayA[2]); // 20
System.out.println("===================");
// 定义数组变量arrayB,将arrayA的地址赋值给arrayB
int[] arrayB = arrayA;
arrayB[2] = 30;
System.out.println(arrayB[0]); // 0
System.out.println(arrayB[1]); // 10
System.out.println(arrayB[2]); // 30
}
}