目录
一、数组的定义和初始化
1. 什么是数组
2. 数组的定义
3. 数组的初始化
4. 操作数组的工具包
二、数组的使用
三、引用类型
1. JVM内存分布
2. 引用变量
3. 默认值 null
四、二维数组
1. 二维数组的定义和初始化
2. 不规则的二维数组
一、数组的定义和初始化
1. 什么是数组
数组就是同一类型、所占内存空间连续的数据的集合。
2. 数组的定义
int[] array = new int[10]; // 整型数组
3. 数组的初始化
动态初始化:指定元素个数。(可分两步)
int[] array = new int[3];// 分两步
int[] array;
array = new int[];
静态初始化:根据初始化的内容确定元素个数。
int[] array = new int[]{1, 2, 3}; // 形式1// 分两步
int[] array;
array = new int[]{1, 2, 3};int[] array = {1, 2, 3}; // 形式2// 不可分两步
int[] array; ×
array = {1, 2, 3}; ×
注意,静态初始化可以省略掉 new int[]。省略的静态初始化不可分两步。
类型 | 默认值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0f |
double | 0.0 |
char | /u0000 |
boolean | false |
引用类型 | null |
4. 操作数组的工具包
Arrays,比如:
Arrays.toString(array) :将数组转字符串。
Arrays.binarySearch(array, value) : 二分查找。
Arrays.copyOf(array, length) : 拷贝指定长度(从头开始),大于被拷贝数组长度就扩容为元素类型对应的默认值。
System.arraycopy 看不到源码,是用 C/C++ 写的系统底层代码,效率高。
Arrays.copyOfRange(array, start, end) : 拷贝指定范围[start, end)。
二、数组的使用
for-each,更方便遍历数组的语法形式:
int[] array = new int[]{1, 2, 3};for(int x: array){System.out.println(x);
}
三、引用类型
数组属于引用类型。
1. JVM内存分布
为了方便管理程序运行时的数据(使用时间长短不一),内存分区。这里主要讲本地方法栈(Native Method Stack)、虚拟机栈(JVM Stack)和堆(Heap)。
本地方法栈:JVM 的底层代码由 C/C++ 实现,这些方法称为本地方法,在本地方法中的局部变量存放在本地方法栈。
虚拟机栈:java 程序中方法的局部变量存放在虚拟机栈,局部变量会随方法的结束而被回收内存。
堆:创建的对象都存放在堆区,只有对象对应的引用变量被回收,对象的内存才会被回收。否则,程序结束才回收。
2. 引用变量
在方法中,基本数据类型变量、引用变量都存放在虚拟机栈中,只不过,基本数据类型变量存放的内容是数据本身;而引用变量的内容是对象的地址。对象存放在堆中。
示例代码:
int[] array = new int[]{1, 2, 3};
数据在内存中的存储图示:
所以将引用变量作为实参传给方法,传的是对象的地址,能通过形参修改实参指向的对象。
3. 默认值 null
引用变量未初始化,默认值为 null。C 语言中 NULL表示内存中的 0 地址(无效的内存地址),而 Java 中 null 表示空引用,都不可读写。
四、二维数组
1. 二维数组的定义和初始化
// 动态
int[][] arr = new int[2][3];
// 静态
int[][] arr = new int[][]{{1, 2, 3}, {4, 5, 6}};
int[][] arr = {{1, 2, 3}, {4, 5, 6}}; // 省略版静态
2. 不规则的二维数组
C语言中的二维数组可省略行,不可省略列。Java相反,可省略列,不可省略行。二维数组实际上就是元素为一维数组的一维数组。
示例代码:
int[][] arr = new int[2][]; // 不可省略行
arr[0] = new int[]{1, 2, 3};
arr[1] = new int[]{4, 5};
在内存中的图示:引用变量array存的二维数组对象的地址,array[0]、array[1]也是引用变量,存的一维数组对象的地址。
遍历行:array.length
遍历第一行的列:array[0].length