1. 数组
1.1 什么数组
数组是一种用于存储多个相同类型数据的存储模型
1.2 数组定义
数组的定义格式有两种:
- 数据类型[] 数组名 示例:int[] arr double[] arr
- 数据类型 数组名[] 示例:int arr[] double arr[]
在实际开发中第一种是比较常用的,所以推荐使用第一种格式定义数组
1.3 数组初始化
数组初始化有两种方式,分别是动态初始化和静态初始化。
1.3.1 数组动态初始化
数组动态初始化就是只给定数组的长度,由系统给出数组的默认初始化值。
动态初始化格式:数据类型[] 数组名=new 数据类型[数组长度]
int[] arr=new int[6];
1.3.2 数组静态初始化
数组静态初始化就是在创建数组时,就直接给定数组的初始化值
静态初始化格式:数据类型[] 数组名={元素1,元素2,…}
int[] arr={1,2,3,4,5,6};
1.4 数组元素访问
每一个存储到数组的元素,都会自动的拥有一个编号,从0开始。
这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。
访问数组元素格式:数组名[索引]
System.out.println(arr[1]);
1.5 内存分配
内存是计算机中的重要原件,临时存储区域,作用是运行程序。
我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
1.5.1 Java中的内存分配
目前我们只需要记住两个内存,分别是:栈内存和堆内存
区域名称 | 作用 |
---|---|
寄存器 | 给CPU使用,和我们开发无关。 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关。 |
方法区 | 存储可以运行的class文件。 |
堆内存 | 存储对象或者数组,new来创建的,都存储在堆内存。 |
方法栈 | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行。 |
栈内存 | 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 |
1.6 数组操作两个常见问题
-
索引越界问题
public class ArrayDemo { public static void main(String[] args) { int[] arr = new int[3]; System.out.println(arr[3]); } }
数组长度是3,索引范围是0-2,但是我们却访问数组中索引为3数据元素,显然是不对的,程序会抛出ArrayIndexOutOfBoundsException 数组越界异常,所以在实际开发中一定要注意访问数组元素,索引一定要在正确的索引范围内。
-
空指针异常
public class ArrayDemo { public static void main(String[] args) { int[] arr = new int[3]; //把null赋值给数组 arr = null; System.out.println(arr[0]); } }
arr=null这行代码,会将数组的内存地址覆盖掉,此时arr已经不保存数组的内存地址了,也就无法再去操作数组了,所以arr[0]才会抛出NullPointerException 空指针异常。