1. 初识数组
- 什么是数组
Java中的数组和c语言中的数组还是有一定的区别的;
数组本质上就是让我们能“批量”创建相同类型的变量,
!!在Java中,数组中包含的变量必须是相同类型。
和c语言中一样,数组是连续存放的
- 数组的创建和初始化
单纯的定义一个数组
数据类型 [ ] 数组名称 = new 数据类型 [ 初始化的数据个数 ];
动态初始化
数据类型 [ ] 数组名称 = new 数据类型 [ ] { 初始化数据 };
静态初始化
数据类型 [ ] 数组名称 = { 初始化数据 };
int[] arr1 = new int [10]; //单纯的定义一个数组
int[] arr2 = new int[] {6,8,9}; //动态初始化
int[] arr3 = {66,88,12}; //静态初始化
要注意的是,在动态初始化和单纯的定义一个数组时,其中的 new 是产生了一个新的对象,在静态初始化中虽然没有 new 出现,但是同样也产生了对象。
---------------------------------------------------------------------------------------------------
了解了数组的创建和初始化,下面我们康康数组是怎么使用的吧。
- 数组的使用
1.数组的访问
和c语言一样,我们也可以使用下标去访问一个数组
int[] array = {1,2,3,4,5,6,7,88};
System.out.println(array[2]);
array[2] = 66;
System.out.println(array[2]);
System.out.println(array[6]);
编译结果:
但是在使用下标一定要注意不可以使下标越界,否则会出现数组越界的异常;
!!!下标是从0开始算起的
给大家看一个数组越界异常的例子
int[] array = {1,2,3,4,5,6,7,88};
System.out.println(array[10]);
所以,使用数组时一定要谨防下标越界!!
下面给大家看一个错误的代码,它也属于数组越界异常的一种。
int[] array = {};
System.out.println(array[0]);
想必大家很好奇这个为什么也会有数组越界的异常吧。
这是因为我们在定义和初始化数组时没有给其长度,其默认长度为0,
所以在访问 array[0] 时就有数组越界的异常啦。
2.数组的长度
在使用数组时,我们几乎每次都要使用数组的长度,Java中求数组长度和c还是有一定区别,并且比c语言方便很多。
使用 数组名.length 便可以获取到数组的长度
. 为成员访问操作符
int[] array = {1,2,3,4,5,6,7,88};
System.out.println(array.length);
同样数组的长度还可用来在for循环中作为控制变量的大小
int[] array = {1,2,3,4,5,6,7,88};
for(int i = 0;i< array.length;i++) {
System.out.println(array[i] + " ");
}
int[] arr = null;
System.out.println(arr.length);
这是一种空指针的异常
3.数组的打印
打印数组有三种方法,分别是:
- for 循环的遍历
int[] array = {1, 2, 3, 4, 5, 6};
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
- for - each
int[] array = {1, 2, 3, 4, 5, 6};
for (int x: array) {
System.out.println(x);
}
到这肯定有人好奇 for 循环和 for - each 的区别是什么
for 循环是用下标进行打印的
for - each 则不需要下标便可以打印,其中 x 代表的是数组中的元素,它是for 循环的另外一种使用方式,能够更方便的完成对数组的遍历,可以避免循环条件和更新语句写错。
- Arrays.toString(用字符串的形式打印)
int[] array = {1, 2, 3, 4, 5, 6};
System.out.println(Arrays.toString(array));
Arrays 是操作数组的工具类,
在使用的时候要导入import java.util.Arrays包
2.数组作为方法的参数
我们以一个数组的打印方法为例
public static void printArr(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5, 6};
printArr(array);
}
int[ ] array 是函数实参
int[ ] arr 是形参
在方法体内,如需获取到数组长度,同样可以使用 数组名.length来获取
3.数组作为方法的返回值
我们以一个将数组扩大二倍的方法为例
public static int[] transform(int[] arr) {
int[] a = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
a[i] = 2*arr[i];
}
return a;
}
public static void main(String[] args) {
int[] array = {1,3,5,7,9};
int[] ret = transform(array);
System.out.println(Arrays.toString(ret));
}
在这个方法中,我们的参数是一个数组,返回值也是一个数组,其实通过这个返回值带回来的是 a 这个数组的引用,里面放的是哈希码
引用其实是就像是c语言中的一个低配版的指针,主要内容我会在之后的博客中提到
4.二维数组
二维数组的本质也就是一维数组,只不过每个元素又是一个一维数组。和c语言中的二维数组是很相似的
-二维数组的创建和初始化
1. 规则数组
int[][] array = {{1,2,3},{4,5,6}} ;
int[][] array1 = new int[][]{{1,3,5},{2,4,6}};
int[][] array2 = new int[2][3];
System.out.println(Arrays.deepToString(array));
System.out.println(Arrays.deepToString(array1));
System.out.println(Arrays.deepToString(array2));
其中Array.deepToString(数组名)是用来打印二维数组的。
2.不规则数组
int[][] array3 = new int[2][];
int[][] array4 = {{1,2},{4,5,6}};
for (int i = 0; i < array4.length; i++) {
for (int j = 0; j < array4[i].length; j++) {
System.out.print(array4[i][j]+" ");
}
System.out.println();
}
在不规则数组打印时,一定要注意每行元素的个数的循环范围