Java中的内存分配
Java 程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
-
栈
存储局部变量
局部变量
a:方法定义中或者方法声明上的所有变量
b:使用完毕,立即消失
-
堆
存储new出来的东西
new出来的东西,实体,对象。
new int[3];
a:每一个实体都有首地址值
b:每一个实体内的数据都有默认值
byte,short,int,long 0
float,double 0.0
char ‘\u0000’
boolean false
引用类型:null
c:使用完毕后,会被垃圾回收器空闲的时候回收。
-
方法区
-
本地方法栈 (系统相关)
-
程序计数器
数组的声明和初始化
-
一维数组声明
int[] arr;
在栈内存声明一片4字节内存arr,这片内存中没有初始化值,可能是无意义的值,所以编译不通过。
-
一维数组“清零”
int[] arr = null;
把arr这片内存清零(赋值null,实际上是0x00000000),此时arr代表一个空指针,并没有指向一个数组
如果此时通过索引获取元素的值,会报NullPointerException异常。
-
一维数组动态初始化
int[] arr = new int[3];
在堆内存中创建(new)一个数组,数组有3个元素,默认所有元素初始化为0,再把首元素的地址这个值(比如0x15db9742)赋给arr,也叫“让arr指向该数组”,此时,才可以通过索引获取元素的值
-
一维数组静态初始化
int[] arr = new int[]{1, 2, 3};
简写 int[] arr = {1,2,3};
-
二维数组动态初始化
int[][] arr = new int[3][2];
二维数组初始化与一维数组不同,它是先在堆中初始化出指针,分别指向一维数组
•int[][] arr = new int[3][];
如果不指定一维数组的元素个数,则相当于NullPointerException
-
//二维数组静态初始化