目录
前言
1. 数组是什么?
2. 创建数组
2.1 基本语法(数组的声明和初始化)
2.2 示例
3. 数组的基本使用
3.1 获取数组的长度
3.2 获取数组中的元素
3.3 遍历数组
3.4 数组作为方法的返回值
3.4.1 直接修改原数组
3.4.2 返回一个新数组
4.理解引用类型
1. int 类型传参:
2. 数组传参:
5. 认识 null
6. 初始 JVM 内存划分
前言
数组是 JavaSE 中遇到的第一个引用类型,在数据结构中属于顺序表。学好数组就是学好数据结构的一个重要基础。
1. 数组是什么?
如果我们需要两个数据就可以直接创建两个变量,如果需要多个数据,直接创建会很麻烦,这时候就会使用“批量生产”,而数组就是可以“批量”创建变量,需要注意的是在 Java 中数组是创建相同类型的变量。
2. 创建数组
2.1 基本语法(数组的声明和初始化)
动态数组:
数据类型[ ] 数组名称 = new 数据类型[ n ];// n 表示的是数组长度
数据类型[ ] 数组名称 = new 数据类型[ ]{ 初始化数据 };
静态数组:
数据类型[ ] 数组名称 = { 初始化数据 };
2.2 示例
// 动态初始化
int[] arr1 = new int[10];
int[] arr2 = new int[]{1, 2, 3, 4};
int[] arr3 = new int[5]{1, 2, 3, 4}; // 部分初始化,没有初始化的数据的默认值为0
// 静态初始化
int[] arr3 = {1, 2, 3, 4};
3. 数组的基本使用
3.1 获取数组的长度
动态数组:
数据类型[ ] 数组名称 = new 数据类型[ n ];// n 表示的是数组长度
数据类型[ ] 数组名称 = new 数据类型[ ]{ 初始化数据 };
静态数组:
数据类型[ ] 数组名称 = { 初始化数据 };
2.2 示例
// 动态初始化
int[] arr1 = new int[10];
int[] arr2 = new int[]{1, 2, 3, 4};
int[] arr3 = new int[5]{1, 2, 3, 4}; // 部分初始化,没有初始化的数据的默认值为0
// 静态初始化
int[] arr3 = {1, 2, 3, 4};
3. 数组的基本使用
3.1 获取数组的长度
3.1 获取数组的长度
3.2 获取数组中的元素
示例中 arr3[2] 取得是数组中下标为 2,但是是数组中的第三个数,因为在数组中下标是从0开始的。[ ] 中的数称作索引,也叫做数组的偏移量,索引的取值范围:0 <= index <= arr.length. 使用[ ]操作既可以读取数据也能修改数据。
数组中最常出现的问题:下标越界
上述代码中数组初始化长度为10,但是却取了第11个数据,第11个数据不存在,这样就会发生下标越界问题。使用数组时一定要考虑边界会不会出现下标越界问题。
3.3 遍历数组
遍历数组使用循环将数组中的所有元素都访问一遍。
方法一:for 循环
int[] arr3 = {1, 2, 3, 4};
System.out.println("数组的遍历:");
for (int i = 0; i < arr3.length; i++) {
System.out.print(arr3[i] + ",");
}
方法二:for - each 循环
int[] arr3 = {1, 2, 3, 4};
for (int i : arr3) {
System.out.print(i + ",");
}
for 循环和 for - each 循环的区别:for - each 循环是 for 循环的另一种方式,但是 for - each 循环不会修改元素。当只需要访问元素不需要修改原数组时使用 for - each 方式。
3.4 数组作为方法的返回值
示例:写一个方法,将数组中的每一个元素都乘以2.
3.4.1 直接修改原数组
3.4.2 返回一个新数组
代码:
public class Demo2 {
public static void main(String[] args) {
int[] arr = {10, 20};
int[] result2 = transform2(arr);
printArr(result2);
printArr(arr);
// System.out.println("---------");
// printArr(result1);
}
// 返回值
// 直接修改原数组
public static int[] transform(int[] arr) {
for (int i = 0; i < arr.length; i++) {
arr[i] *= 2;
}
return arr;
}
// 返回一个新的数组
public static int[] transform2(int[] arr) {
int[] result = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
result[i] = arr[i] * 2;
}
return result;
}
// 打印数组
public static void printArr(int[] arr) {
for (int i : arr) {
System.out.print(i + ",");
}
System.out.println();
}
}
4.理解引用类型
引用是什么?就相当于一个“别名”,创建一个引用就意味着创建一个变量,这个变量保存着一个地址。
通过传参这个例子体会引用类型是如何传参,以及元素在内存中的存储。
示例:交换两个元素的值。
1. int 类型传参:
从运行结果来看 a 和 b 的值并没有交换,这是因为调用 swapValue 方法时将实参 a, b(也就是main 方法的 a, b) 的值赋给swapValue中的形参 a,b ,然后交换了 swapValue() 中两个形参的值,但是本质上实参 a,b 的值并没有交换。
过程如图:
2. 数组传参:
数组是一个引用类型,int[ ] arr = {10,20} 中的 arr 只是一个引用,在内存中 arr 引用的是存储数组的起始地址。将 main 函数中的 arr 传给 swap 方法,使 swap 方法中的 arr 也引用同一个数组的起始位置,这样数组中发生的改变是对于两个 arr 是一样的。具体过程如下图:
5. 认识 null
null 在 Java 数组中表示“空引用”,空指针异常也是数组中遇到的常见错误。
6. 初始 JVM 内存划分
JVM 内存会被划分成好几个区域,目前我们只重点理解栈和堆。
栈:栈中保存的是函数中的局部变量(包括方法中的形参和实参)和引用;堆:所有 new 出的对象都保存在堆上;堆的空间非常大,栈的空间比较小;堆是整个 JVM 共享一个,而一个 JAVA 程序中可能会存在多个栈。
比如引用类型在 JVM 上的分配:



