Java内存分析
Java内存主要分为堆、栈和方法区
- 堆
- 存放
new
的对象和数组 - 可以被所有的线程共享,不会存放到别的对象引用
- 存放
- 栈
- 存放基本变量类型(包含这个基本类型的具体数值)
- 引用对象的变量(会存放这个引用在堆里的具体地址)
- 方法区
- 可以被所有的线程共享
- 包含了所有的
static
和class
变量
以数组为例进行举例
声明一个数组时:
int[] array;
,进行压栈创建数组时:
array = new int[10];
,产生了new
,此时在堆中分配了一个空间,开辟了一个初始大小为10的内存空间给数组元素赋值
array[0] = 1; array[1] = 2; array[2] = 3; array[3] = 4; array[4] = 5; array[5] = 6; array[6] = 7; array[7] = 8; array[8] = 9; array[9] = 10;
假如输出第11个元素
System.out.println(array[10]);
这个元素不存在,会发生数组下标越界异常:
==
java.lang.ArrayIndexOutOfBoundsException
==
下面是我自行画的图,嘿嘿
数组的三种初始化
静态初始化
int[] a = {1, 2, 3}; // 创建 + 赋值 => 一经创建就长度固定 Man[] mans = {new Man(1, 1), new Man(2, 2)}; // 引用类型
动态初始化(==包含默认初始化==)
int[] a = new int[2]; // 创建之后,所有的元素默认为0,所以需要下面手动赋值 a[0] = 1; a[1] = 2;
数组的默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式的初始化
数组的四个基本特点
- 长度是确定的,数组一旦被创建,它的大小就是固定的
- 它的元素必须是相同类型的,不允许出现混合类型
- 数组中的元素可以是任何数据类型,包括基本类型和引用类型
- 数组的变量属于引用类型,数组也可以看成是对象,数组的元素就相当于该对象的成员变量
数组本身就是对象,Java中对象是在堆中的,正如上面画的图中所示,==数组对象本身是在堆中的==
数组边界
下标的合法区间:[0, length - 1],如果越界就会报错;
==java.lang.ArrayIndexOutOfBoundsException
==
小结
- 数组是相同数据类型的有序集合
- 数组是对象,数组元素相当于对象的成员变量
- 数组长度固定;下标越界就会报错(
java.lang.ArrayIndexOutOfBoundsException
)