1. 数组基本用法
1.1 什么是数组
1.2 创建数组
1.3 数组的使用
2. 数组作为方法的参数
2.1 基本用法
2.2 理解引用类型
2.3 认识null
3. 数组作为方法的返回值
4. 二维数组
1. 数组的基本用法
1.1 什么是数组
如果需要表示两个数据, 那么直接创建两个变量即可 int a; int b;
如果需要表示五个数据, 那么可以创建五个变量 int a1,a2,a3,a4,a5;
但是如果需要表示一万个数据, 那么就不能创建一万个变量了. 这时候就需要使用数组, 帮我们批量创建.
数组是存储一组相同数据类型的数据的集合,或者说,数组能帮我们“批量”创建相同的变量。
1.2 创建数组
Java中数组共有3种创建方式:
//动态初始化
数据类型[] 数组名称 = new 数据类型 [] { 初始化数据 };
int[] arr = new int[]{1, 2, 3};
//静态初始化
数据类型[] 数组名称 = { 初始化数据 };
int[] arr = {1,2,3};
//或:
数据类型[] 数组名称 = new 数据类型[数组长度];
int[] arr = new int[3];
1.3 数组的使用
使用.length来确定数组长度:
int[] arr = new int[]{1,2,3,4,5};
System.out.println(arr.length);
//结果:
5
结果表明arr数组的长度为5.
访问数组中的元素:
int[] arr = new int[]{1,2,3,4,5};
System.out.println(arr[4]);
//结果:
5
注意:Java中数组下标从0开始,数组长度为length,即访问下标的范围[0,length-1],当访问的下标超过该范围时,会出现下标越界异常,如:
int[] arr = new int[]{1,2,3,4,5};
System.out.println(arr[-1]);
结果:
该结果表明arr数组的-1下标越界。
数组的遍历:
所谓 “遍历” 是指将数组中的所有元素都访问一遍, 不重不漏. 通常需要搭配循环语句.
使用for循环遍历数组:
int[] arr = {1, 2, 3, 4, 5};
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
//结果:
1 2 3 4 5
使用for each循环遍历数组:
int[] arr = {1, 2, 3,4,5};
for (int x : arr) {
System.out.print(x+" ");
}
//结果:
1 2 3 4 5
for each循环是for循环的另一种使用方式,能够更方便地完成对数组的遍历,可以避免循环条件和更新语句写错,但for each循环无法获得数组的下标。
2. 数组作为方法的参数
2.1 基本用法
将main方法中的数组传到print方法并进行输出:
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
print(arr);
}
public static void print(int[] a) {
for (int x : a) {
System.out.print(x+" ");
}
}
//结果:
1 2 3 4 5
int[] a 是函数的形参, int[] arr 是函数的实参.
如果需要获取到数组长度, 同样可以使用 a.length
2.2 理解引用类型
我们都知道,当我们将实参赋值给形参,交换形参的值时,实参的值不会发生变化,而对于数组而言:
public static void main(String[] args) {
int[] arr = {1, 2, 3};
func(arr);
System.out.println("arr[0] = " + arr[0]);
}
public static void func(int[] a) {
a[0] = 10;
System.out.println("a[0] = " + a[0]);
}
// 执行结果
a[0] = 10
arr[0] = 10
很显然,当数组名作为参数时,改变形参的值,实参的值也发生了改变,此时数组名 arr 是一个 “引用” . 当传参的时候, 是按照引用传参.
那么要如何理解呢?首先我们要从内存说起。
如何理解内存?
内存可以直观的理解成一个宿舍楼. 有一个长长的大走廊, 上面有很多房间。每个房间的大小是 1 Byte.每个房间上面又有一个门牌号, 这个门牌号就称为 地址。
什么是引用?
我们提到了上述例子中数组名arr是一个引用,创建arr这个引用时只是在栈上创建了一个很小的变量,它存放的是一个数组在堆上的一个地址。
如图,我们在栈上定义了一个引用类型的变量arr,它存放了一个堆上的数组的地址,即它指向了这个地址为0x999的数组。所谓的 “引用” 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只是将数组的地址传入到函数形参中,如上述例子中将 arr 指向的数组的地址传给 a ,即 arr 和 a 都指向这个数组,这样,当我们在func方法中通过 a 来对数组的值进行修改后,main方法中的 arr 所指向的数组的值自然也会改变。
2.3 认识null
null在Java中表示空引用,也就是一个无效的引用。
int[] arr = null;
System.out.println(arr[0]);
// 编译会产生错误
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:6)
null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置. 因此不能对这个内存进行任何读写操作. 一旦尝试读写, 就会产生错误。
3. 数组作为方法的返回值
: 写一个方法, 将数组中的每个元素都 * 2:
class Test {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
int[] output = transform(arr);
printArray(output);
}
public static void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static int[] transform(int[] arr) {
int[] ret = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
ret[i] = arr[i] * 2;
}
return ret;
}
}
在定义方法时,方法类型为int[ ]类型,这样即可返回一个数组。
4. 二维数组
定义二维数组(3种定义方法):
int[][] array1 = {{1,2,3},{4,5,6}};
int[][] array2 = new int[][] {{1,2,3},{4,5,6}};
int[][] array3 = new int[2][3];
二维数组是由多个一位数组组成的,在Java中,用一个一位数组来表示数组的行数,该数组的每一行存放的是这一行数组的地址,每行又用一个数组来存放这一行的所有元素,如:
在上述二维数组中,该数组共2行3列,array数组用来存放数组的行数,0下标用来存放第0行数组的首地址,1下标用来存放第1行数组的首地址,每行又分别用一个数组来存放这一行的元素。
打印二维数组:
第一种:
int[][] array = {{1,2,3},{4,5,6}};
for(int i=0;i<array.length;i++)
{
for(int j=0;j<array[i].length;j++)
{
System.out.print(array[i][j]+" ");
}
System.out.println();
}
//结果:
1 2 3
4 5 6
或将for循环更换为for each循环:
int[][] array = {{1,2,3},{4,5,6}};
for(int ret[]:array){
for(int X:ret){
System.out.print(X+" ");
}
System.out.println();
}
//结果:
1 2 3
4 5 6
第二种打印:
int[][] array = {{1,2,3},{4,5,6}};
System.out.println(Arrays.deepToString(array));
//结果:
[[1,2,3],[4,5,6]]
定义不规则二维数组
第一种:
int[][] array = new int[2][];
array[0] = new int[ ]{1,2};
array[1] = new int[]{4,5,6};
System.out.println(Arrays.deepToString(array));
//结果:
[[1, 2], [4, 5, 6]]
第二种:
int[][] array = {{1,2},{4,5,6}};
System.out.println(Arrays.deepToString(array));
//结果:
[[1, 2], [4, 5, 6]]
The end