【JavaSE】数组详解

前言

Java的数组跟C语言的数组整体上很相似,但还是有一些细小的区别需要我们去注意,如:数组的初始化、数组的遍历方式、二维数组等等,接下来就让我们一起学习Java的数组吧

1. 数组的基本概念

数组相同类型元素的一个集合,它在内存中是一段连续的空间。每个元素都有自己的下标,第一个元素的下标为0,往后以此类推。下标可以让我们准确地定位到数组中的某个元素

2. 数组的创建和初始化

在Java中,我们有以下三种创建和初始化的方式,第一种是我们最常用的方式,它是第二种方式的简化

int[] array1 = {1,2,3,4,5};
int[] array2 = new int[]{1,2,3,4,5};
int[] array3;
array3 = new int[]{1,2,3,4,5};

要注意,我们在初始化的时候,括号[ ]内不能填上任何数字,Java会在你的初始化后自动计算数组的长度。此时若在括号[ ]内写上数字,idea就会报出警告

那如果我们只是想创建一个数组,并不想马上初始化它,那么我们就可以这样写,这时候就要在括号[ ]内写上数组的长度

int[] array = new int[5];

而且数组中的元素也会有其默认值

  • 对于基本数据类型,除了boolean类型的默认值是false,其他的默认值一律是0
  • 对于引用数据类型,默认值为null

3. 数组的访问和遍历

在前面我们说过,数组在内存中是一段连续的空间,数组中的每一个元素都有其对应的下标,我们可以通过下标来访问数组中任意位置的元素。要注意,数组的下标是从0开始的,依次递增

3.1 数组的访问

int[] array = {1,2,3,4,5};
System.out.println(array[0]); // 1
System.out.println(array[4]); // 5

要特别注意,我们在访问数组元素时一定不能越界,否则编译器会报错,如下:

 3.2 数组的遍历

遍历指的是将数组中的所有元素全部访问一遍,在Java中我们通常用以下三种方法来遍历数组

方法一:for 循环遍历

int[] array = {1,2,3,4,5,6,7,8,9,10};
for (int i = 0; i < array.length; i++) {
    System.out.print(array[i]+" ");
}

打印如下:

方法二:for-each 遍历 

int[] array = {1,2,3,4,5,6,7,8,9,10};
for (int x:array) {
    System.out.print(x+" ");
}

打印如下:

3.  使用Arrarys包将数组以字符串的形式来遍历

int[] array = {1,2,3,4,5,6,7,8,9,10};
System.out.println(Arrays.toString(array));

打印如下:

4. 数组类型的剖析

Java的数据类型分为基本数据类型和引用数据类型两种,数组就是属于引用数据类型

数组中保存的内容可以简单理解成数组在堆空间中的首地址

array是数组类型的引用变量,它并不直接存储对象本身,而是存储对象在堆中空间的起始地址,通过地址,引用变量就可以去操作对象。理解这个之后,我们再看一个代码

int[] array1 = {1,2,3};
int[] array2 = new int[3];
array2 = array1;
array2[0] = 10;
array2[1] = 20;
array2[2] = 30;
System.out.println(Arrays.toString(array1));

打印如下: 

根据打印结果,我们可以知道,array1里的内容已经变为[10, 20, 30]。这是因为array2这个引用指向了array1所指向的对象,也就是array1里的内容赋值给了array2,因此我们通过array2可以改变array1里的内容,而array2原先指向的对象就会被回收

通过上面这个例子,我们可以知道,多个引用可以指向同一个对象,但是一个引用绝对不可以同时指向多个对象的,这个点需要牢记

5. null的含义

null在Java中表示“空引用”,它不指向任何对象,我们在初始化值未知的情况下可以使用到它

int[] array = null;
System.out.println(array[0]);

就像上面这个例子,我们把一个数组初始化为null,此时再访问数组中的元素,编译器就会报出“空指针异常”的警告,我们不能对这个内存进行任何读写操作,否则就会有 NullPointerException

6. 数组作为函数的返回值

打印如下:

通过上面的例子我们可以看出:

  • 在Java中数组可以作为方法的参数,参数可以接收引用数据类型
  • 数组也可以作为方法的返回值,在方法结束后,局部变量array会被回收,但它所指向的对象还存在堆中,因此可以用新的引用去接收它,再进行其他操作

7. Java自带的操作数组方法

  • 以字符串打印数组 —— int[ ]  Arrays.toString(int[ ] array)
  • 拷贝数组 —— int[ ]  Arrays.copyOf(int[ ] original, int newLength)  —— 拷贝array到original中,newLength为新数组的长度,若超出array的长度,就会自动扩容并且默认值为0
  • 判断两个数组内容是否一样 —— boolean  Arrays.equals(int[ ] a, int[ ] b) —— 相等返回true,反之返回false
  • 填充数组 —— void Arrays.fill(int[ ] array, int a) —— 将数组array中的元素都填充为a

8. 二维数组

定义:二维数组的本质也就是一维数组,只不过它的元素又是一个一维数组

8.1 二维数组的创建和初始化

int[][] array1 = {{1,2,3},{4,5,6}};
int[][] array2 = new int[][]{{1,2,3},{4,5,6}};
int[][] array3 = new int[2][3];

8.2 二维数组的遍历

int[][] array1 = {{1,2,3},{4,5,6}};
for (int i = 0; i < array1.length; i++) {
    for (int j = 0; j < array1[0].length; j++) {
        System.out.print(array1[i][j]+" ");
    }
    System.out.println();
}

因为二维数组本质上是以一维数组为元素的一维数组,所以我们的行数就是array1的长度 - array1.length,列数就是元素的长度 - array1[0].length。这样就能非常快速地遍历二维数组

打印如下:

8.3 不规则的二维数组

我们在创建二维数组时,可以只写行数,不写列数,如下:

int[] array = new int[2][];

这时候该二维数组里每个元素都是null,当我们使用 array[i].length就会报错。我们可以利用这一点创建不规则数组

int[][] array = new int[2][];
array[0] = new int[5];
array[1] = new int[3];

 这样我们就可以单独为每一行分配内存,可操作性更强

结语

今天我们一起学习了Java中的数组相关知识,还是有挺多新知识的,在有C语言的基础下,还是能很快掌握这些知识的。也希望大家能喜欢这篇文章,有总结不到位的地方还请多多谅解,若有出现纰漏,希望大佬们看到错误之后能够在私信或评论区指正,博主会及时改正,共同进步!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值