day04-数组
5. 数组
5.1 JVM内存模型(掌握)
JVM内存划分,人为的根据不同内存空间的存储特点以及存储的数据。
-
方法区:线程共享的内存区域,存储已被虚拟机加载的类信息
-
Java虚拟机栈:简称栈,每个方法被执行的时候都会同时创建一个栈帧用于存储该方法的局部变量
-
Java堆:所有的对象实例以及数组都要在堆上分配。
-
每次使用new关键字,就表示在堆内存中开辟一块新的存储空间。
5.2.1 什么是数组(了解)
所谓数组,把具有相同类型的多个常量值有序组织起来的一种数据形式。这些按一定顺序排列的多个数据称为数组。而数组中的每一个常量值称之为数组元素,数组中使用索引来表示元素存放的位置,索引从0开始,步长是1,有点像Excel表格的行号。
5.2.2 定义语法(重点)
回忆定义变量的语法:
数据类型 变量; 如 int age;
数组的定义语法:
数组元素类型[] 数组名; 如 int[] ages;
另一种方式:int ages[]; 不推荐
5.3 数组的初始化(重点)
数组在定义后,必须初始化才能使用。所谓初始化,就是在堆内存中给数组分配存储空间,并为每一个元素赋上初始值,有两种方式:
-
静态初始化;
-
动态初始化;
数组的长度是固定的
5.3.1 静态初始化(重点)
int[] nums = new int[]{1,3,5,7,9};
简单写法:
int[] nums = {1,3,5,7,9};//简单写法,定义和初始化必须同时写出来
5.3.2 静态初始化内存分析(重点)
public class ArrayDemo1{
public static void main(String[] args) {
//定义并初始化数组
int[] nums = new int[] { 1, 3, 5, 7 };
System.out.println("数组长度=" + nums.length);
//重新初始化数组
nums = new int[] { 2, 4, 8 };
System.out.println("数组长度=" + nums.length);
}
}
对上述代码做内存分析
5.3.3 动态初始化(重点)
语法:数组元素类型[] 数组名 = new 数组元素类型[length];
int[] nums = new int[5];
不同数据类型的初始值:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-801Vp1yB-1596538915179)(E:\内网通下载\笔记\img\image-20200804144456105.png)]
5.3.4 动态初始化内存分析(重点)
public class ArrayDemo2 {
public static void main(String[] args) {
//定义并初始化数组
int[] nums = new int[3];
System.out.println("数组长度=" + nums.length);
//重新初始化数组
nums = new int[5];
System.out.println("数组长度=" + nums.length);
}
}
对上述代码做内存分析
5.4 数组操作(重点)
5.4.1 基本操作(重点)
获取元素值,语法:元素类型 变量名 = 数组名[index];
int size = nums.length; -> 输出结果4
设置元素值,语法:数组名[index] = 值;
设置第二个元素值为30 nums[1] = 30;
获取第二个元素: int ele2 = nums[1]; 输出30
常见的异常
-
NullPointerException:空指针异常(空引用异常)
操作了一个尚未初始化或者没有分配内存空间的数组
-
ArrayIndexOutOfBoundsException:数组的索引越界异常
操作的数组的索引不在[0,数组名.length-1]范围内
使用for-each(增强for循环)操作数组(当不需要用到索引的时候 用for-each)
使用变量去接受每次遍历出来的元素,不再需要使用索引去数组中获取指定的元素
for(数组元素类型 变量: 数组){
//TODO
}
例如:
int[] nums = new int[] { 1, 3, 5, 7 };
for (int ele : nums) {
System.out.println(ele);
}
5.5.二维数组(了解)
在之前,数组的每一个元素就是一个个的值,这种数组我们称之为一维数组。如:
int[] nums = {1,2,3,4,5};
这个数组中存储的是int类型的元素,该数组就是一个一维数组。
二维数组,就是数组中的每一个元素是另一个一维数组。
5.5.1 二维数组的定义和初始化
定义和静态初始化二维数组的语法:
数组元素类型[][] 数组名 = new 数组元素类型[][]{数组1,数组2,数组3,...};
注意,二维数组中的元素类型是一维数组,把数组元素类型[]看成一个整体,表示数据类型。
public class ArrayInArrayDemo1 {
public static void main(String[] args) {
//定义三个一维数组
int[] arr1 = { 1, 2, 3 };
int[] arr2 = { 4, 5 };
int[] arr3 = { 6 };
//把三个一维数组存储到另一个数组中,那么该数组就是二维数组
int[][] arr = new int[][] { arr1, arr2, arr3 };
}
}
定义和动态初始化二维数组的语法:
数组元素类型[][] 数组名 = new 数组元素类型[x][y];
x表示二维数组中有几个一维数组
y表示每一个一维数组中有几个元素。
int[][] arr = new int[3][5];
System.out.println(arr.length); //输出3
5.5.2 获取二维数组的元素
因为二维数组表示数组的中的数组,如果要获取数组的每一个元素值,则需要两个循环嵌套。
//二维数组
int[][] arr = new int[][] {
{ 1, 2, 3 },
{ 4, 5 },
{ 6 }
};
使用for循环:
for (int index = 0; index < arr.length; index++) {
//取出每一个一维数组
int[] arr2= arr[index];
//迭代一维数组
for (int j = 0; j < arr2.length; j++) {
int ele = arr2[j];
System.out.println(ele);
}
System.out.println("-----");
}
使用for-each:
for (int[] arr2 : arr) {
//arr2为每次遍历出来的一维数组
for (int ele : arr2) {
//ele为从arr2一维数组中遍历出来的元素
System.out.println(ele);
}
System.out.println("-----");
}
.out.println("-----");
}
**使用for-each:**
```java
for (int[] arr2 : arr) {
//arr2为每次遍历出来的一维数组
for (int ele : arr2) {
//ele为从arr2一维数组中遍历出来的元素
System.out.println(ele);
}
System.out.println("-----");
}