1. 概述
-
定义:用于存储相同数据类型的数据容器
-
特点:有一定大小、元素的数据类型相同
-
语法结构:
元素的数据类型[] 数组名称 = new 元素的数据类型[数组容器的大小];
-
语法解释:
-
元素
:数组中的数据、数组中的变量 -
元素的数据类型
:数组中的数据的数据类型 -
[]
:表示是一个一维数组 -
数组名称
:数组本身也是一个变量,用于存储数组的地址的变量 -
=
:赋值符号,将数组的地址,赋值给数组的名称 -
new
:用于在堆内存中开辟空间 -
元素的数据类型
:和前面的元素的数据类型保持一致 -
数组容器的大小
:可以存储数据的个数
-
-
打印数组的结果:
[D@5cad8086
-
[
:表示这是一个一维数组 -
D
:表示数组中存储的是 double 类型的数据 -
@
:普通的分隔符,没有具体的含义 -
5cad8086
:数组有一个内存地址,通过 hashCode 方法,将这个内存地址计算成了一个数字,用于表示这个内存地址,将这个数字转成十六进制的表示形式
-
2. 数组的初始化
-
为数组分配空间,并且赋值。
-
分类:
-
静态初始化:在程序书写的时候,就知道了数组中的元素是什么值
-
动态初始化:程序运行过程中,才能知道究竟给元素赋什么值
-
2.1 静态初始化
-
语法结构:
元素的数据类型[] 数组名称 = new 元素的数据类型[] {元素值的罗列}; 或 元素的数据类型[] 数组名称 = {元素值的罗列};
语法示例:
-
double[] douArr = new double[] {9.9d,8.7,7,0}; 或 double[] douArr = {9.9d,8.7,7,0};
-
注意事项:
-
在第二个方括号中,不要写数组元素的个数。
-
元素值的罗列,元素和元素之间,使用逗号分隔。写了几个元素,就分配多大空间。
-
罗列出来的元素值,数据类型必须和声明的数组元素的数据类型一致。
-
数组名称的声明,数组名称的赋值,不能分成两行写。
-
-
语法结构:
-
2.2 动态初始化
-
// 声明一个数组并初始化为3个长度 double[] douArr = new double[3]; // 给元素赋值,方式:数组名称[元素的索引] = 元素值; douArr[0] = 3.5; douArr[1] = 4d; douArr[2] = 7;
-
元素索引:下角标;从
0
开始,数组长度 -1
结束。 -
注意事项:
-
所有的元素,都需要逐个赋值。
-
如果数组中的元素,没有赋值,元素也有一个默认的初始化值,为各数据类型的默认值。
3. 数组的内存理解
-
JVM 是执行 Java 的容器,空间很大,按照不同的功能、不同的特点划分了三个区域:堆内存(heap)、栈内存(stack)、方法区(method)。
-
堆内存【常用】:用于存储数组、对象等数据量较大的数据。一般都是引用数据类型。
-
栈内存【常用】:用于执行方法,每个方法单独的分配一段空间,称为栈帧,把给方法分配内存空间,形象的称为“进栈”。特点:先进后出。
-
4. 数组异常
4.1 数组下角标越界异常
-
异常代码:方法区【常用】:用于存储类的字节码对象,存储常量、存储静态变量。
public static void main(String[] args) { int[] intArr = new int[2]; System.out.println(intArr[2]); }
-
异常显示:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
异常原因:访问了数组中不存在的索引,超过元素索引范围,都会出现异常情况。
-
4.2 空指针异常
-
异常代码:
public static void main(String[] args) { int[] intArr = {3, 5, 9}; intArr = null; System.out.println(intArr[0]); }
异常原因:当引用不再指向任何的堆内存中的数据时,仍然要通过这个引用访问堆内存中的数据,只能抛出异常。
-
避免方式:
public static void main(String[] args) { int[] intArr = {3, 5, 9}; intArr = null; if (intArr != null) { System.out.println(intArr[0]); } }
-