• 19_数组原理内存图


    第19章 数组原理内存图

    作者:张子默

    一、内存概述

    内存是计算机中的重要元件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。

    Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

    二、Java虚拟机的内存划分

    为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

    JVM内存划分

    区域名称作用
    寄存器给CPU使用,和我们开发无关。
    本地方法栈JVM在使用操作系统功能的时候使用,和我们开发无关。
    方法区存储可以运行的class文件。
    堆内存存储对象或者数组,new来创建的,都存储在堆内存。
    方法栈方法运行时使用的内存,比如main方法运行,进入方法栈中执行。

    三、数据在内存中的存储

    1、一个数组内存图

    public static void main(String[] args) {
        int[] arr = new int[3];
        System.out.println(arr);//[I@5f150435
    }
    
    • 1
    • 2
    • 3
    • 4

    以上方法执行,输出结果是[I@5f150435,这个是数组在内存中的地址。new出来的内容,都是在堆内存中存储的,而方法中的变量arr保存的是数组的地址。

    输出arr[0],就会输出arr保存的内存地址中数组0索引上的元素
    在这里插入图片描述

    2、两个数组内存图

    public static void main(String[] args) {
        int[] arr = new int[3];
        int[] arr2 = new int[2];
        System.out.println(arr);
        System.out.println(arr2);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    3、两个变量指向一个数组

    public static void main(String[] args) {
        // 定义数组,存储3个元素
        int[] arr = new int[3];
        //数组索引进行赋值
        arr[0] = 5;
        arr[1] = 6;
        arr[2] = 7;
        //输出3个索引上的元素值
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        //定义数组变量arr2,将arr的地址赋值给arr2
        int[] arr2 = arr;
        arr2[1] = 9;
        System.out.println(arr[1]);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    四、实例

    • 一个数组
    package com.zzm.day05.demo02;
    
    /**
     * 用途:
     * 时间:2021/5/20 10:53
     * 创建人:张子默
     */
    public class Demo01ArrayOne {
    
        public static void main(String[] args) {
            int[] array = new int[3]; // 动态初始化
            System.out.println(array); // 地址值
            System.out.println(array[0]); // 0
            System.out.println(array[1]); // 0
            System.out.println(array[2]); // 0
    
            // 改变数组当中元素的内容
            array[1] = 10;
            array[2] = 20;
            System.out.println(array); // 地址值
            System.out.println(array[0]); // 0
            System.out.println(array[1]); // 10
            System.out.println(array[2]); // 20
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 两个数组
    package com.zzm.day05.demo02;
    
    /**
     * 用途:
     * 时间:2021/5/20 10:53
     * 创建人:张子默
     */
    public class Demo02ArrayTwo {
    
        public static void main(String[] args) {
            int[] arrayA = new int[3]; // 动态初始化
            System.out.println(arrayA); // 地址值
            System.out.println(arrayA[0]); // 0
            System.out.println(arrayA[1]); // 0
            System.out.println(arrayA[2]); // 0
            System.out.println("===============");
    
            // 改变数组当中元素的内容
            arrayA[1] = 10;
            arrayA[2] = 20;
            System.out.println(arrayA); // 地址值
            System.out.println(arrayA[0]); // 0
            System.out.println(arrayA[1]); // 10
            System.out.println(arrayA[2]); // 20
            System.out.println("===============");
    
            int[] arrayB = new int[3]; // 动态初始化
            System.out.println(arrayB); // 地址值
            System.out.println(arrayB[0]); // 0
            System.out.println(arrayB[1]); // 0
            System.out.println(arrayB[2]); // 0
            System.out.println("===============");
    
            // 改变数组当中元素的内容
            arrayB[1] = 100;
            arrayB[2] = 200;
            System.out.println(arrayB); // 地址值
            System.out.println(arrayB[0]); // 0
            System.out.println(arrayB[1]); // 100
            System.out.println(arrayB[2]); // 200
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 两个变量指向一个数组
    package com.zzm.day05.demo02;
    
    /**
     * 用途:
     * 时间:2021/5/20 10:53
     * 创建人:张子默
     */
    public class Demo03ArraySame {
    
        public static void main(String[] args) {
            int[] arrayA = new int[3]; // 动态初始化
            System.out.println(arrayA); // 地址值
            System.out.println(arrayA[0]); // 0
            System.out.println(arrayA[1]); // 0
            System.out.println(arrayA[2]); // 0
            System.out.println("===============");
    
            // 改变数组当中元素的内容
            arrayA[1] = 10;
            arrayA[2] = 20;
            System.out.println(arrayA); // 地址值
            System.out.println(arrayA[0]); // 0
            System.out.println(arrayA[1]); // 10
            System.out.println(arrayA[2]); // 20
            System.out.println("===============");
    
            // 将arrayA数组的地址值赋值给arrayB数组
            int[] arrayB = arrayA;
            System.out.println(arrayB); // 地址值
            System.out.println(arrayB[0]); // 0
            System.out.println(arrayB[1]); // 10
            System.out.println(arrayB[2]); // 20
            System.out.println("===============");
            // 改变数组当中元素的内容
            arrayB[1] = 100;
            arrayB[2] = 200;
            System.out.println(arrayB); // 地址值
            System.out.println(arrayB[0]); // 0
            System.out.println(arrayB[1]); // 100
            System.out.println(arrayB[2]); // 200
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
  • 相关阅读:
    【重拾C语言】十二、C语言程序开发(穷举与试探——八皇后问题)
    结构型-代理模式
    [探究] program break (chatgpt 协助)
    动态SQL
    CG8-v2.0-光照着色
    安装虚拟机及centos7
    使用第三方账号认证(番外):向钉钉用户推送通知
    ASP.NET Core 6框架揭秘实例演示[01]: 编程初体验
    Ubuntu离线源的制作
    socket、websoket、netty、socket.io 对比
  • 原文地址:https://blog.csdn.net/a1448824839/article/details/125558752