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

    }
}

程序执行流程:

  1. ArrayOneDemo01.class 文件进入方法区
  2. main方法进入方法栈执行
  3. 创建数组,JVM会在堆内存中开辟空间,存储数组
  4. 数组在内存中会有自己的内存地址,以16进制表示(前面加 0x )
  5. 数组中有3个元素,默认值为0
  6. JVM将数组的内存地址赋值给引用类型变量arrayA
  7. 变量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
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35132089/article/details/108189269
今日推荐