1、Java中的内存划分
Java的内存需要分成5个部分:
栈(Stack) 存放的都是 方法 中的 局部变量 。方法的运行一定要在栈当中运行。
局部变量:方法的参数,或者是方法{}内部的变量
作用域:一旦超出作用域,立刻从栈内存当消失。
堆(Heap) 凡是 new 出来的东西,都在堆当中。
堆内存里面的东西都是一个地址值:16进制
堆内存里面的数据,都有默认值。规则:
如果是整数 默认为0
如果是浮点数 默认为0.0
如果是字符 默认为'\u0000'
如果是布尔 默认为false
如果是引用类型 默认为null
方法区(Method Area) 存储.class相关信息,包含方法的信息。 本地方法栈
(Native Method Stack)
与操作系统相关。 寄存器(pc Register) 与CPU相关。
2、一个数组的内存图
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 System.out.println("================="); //改变数组当中元素的内容 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 } } D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2022.2.3\lib\idea_rt.jar=3614:D:\BaiduNetdiskDownload\IntelliJ IDEA 2022.2.3\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\variableandoperator Demo01ArrayOne [I@776ec8df 0 0 0 ================= [I@776ec8df 0 10 20 Process finished with exit code 0
3、两个数组的内存图
public class Demo02ArrayOne { 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 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 } } D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2022.2.3\lib\idea_rt.jar=4940:D:\BaiduNetdiskDownload\IntelliJ IDEA 2022.2.3\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\variableandoperator Demo02ArrayOne [I@776ec8df 0 0 0 ================= [I@776ec8df 0 10 20 [I@4eec7777 0 0 0 ================= [I@4eec7777 0 100 200 Process finished with exit code 0
4、两个引用指向同一个数组的内存图
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 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 } } D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2022.2.3\lib\idea_rt.jar=6276:D:\BaiduNetdiskDownload\IntelliJ IDEA 2022.2.3\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\variableandoperator Demo03ArraySame [I@776ec8df 0 0 0 ================= [I@776ec8df 0 10 20 [I@776ec8df 0 10 20 ================= [I@776ec8df 0 100 200 Process finished with exit code 0