本文主要介绍一些关于Java数组的易错易忘的知识点,并不系统完善,如有在意,还请见谅。
一、数组初始化
💭 :这个还不简单吗?初始化有什么能藏起来的? 😪
💬 :虽然初始化本身简单,但下面两点你可能从未注意到过噢
1.在提供初始化时,最后一个值后允许有逗号
如上所示,Java在初始化数组时,是允许最后一个值留有逗号的,据说是为了方便后面继续加数据(不是追加,是在初始化时加)
👻 别忘了:Java中数组的长度在初始化后就不变了噢,要可变的,就使用ArrayList
2.数组初始化的默认值
如果你并不是赋值初始化一个数组,而是new的,那么Java会给数组内的元素一个默认值。对应关系如下:
- 数字数组 ——> 0
- boolean数组 ——> false
- 对象数组 ——> null
❓什么是对象数组呢
简言之就是元素都是类的对象的数组。
最常用的String字符串数组,就是典型的对象数组,因为String字符串其实是标准Java类库中提供的一个预定义类,并不属于基本数据类型。
二、数组拷贝
有时你可能做过数组间的赋值,如果你希望的是得到两个内容相同、地址不同的数组,该怎么做呢?
❌错误做法:直接使用等号赋值
这样做,只会将nums_b指向nums_a,即两个数组指向同一块地址,当nums_b改变时nums_a也会跟着改变。这也是方法中传递数组参数时,原数组会发生变化的原因。
✔️正确做法:使用Arrays类型的copyOf()方法
这里的第一个参数传入要复制的原数组,第二个参数传入复制的元素长度(如果小于原数组长,则只赋值前面一部分)
⭕️补充:除了用来赋值数组外,由于第二个参数是自定义长度,其实还可以用来增加、剪切数组,达到动态改变数组长度的效果,不过这样时空花销太大,不建议多处使用
三、多维数组的真相
下面主要以二维数组为例,高维数组同理
1.二维数组的初始化
Java中多维数组的初始化与C++语言不同,C++在初始化时可以只给出列长度,然后根据赋值判断有多少行,而Java则不可以只给出列长度,但是可以只给出行长度。
如下所示:
❓为什么会这样呢
因为Java实际上没有多维数组,只有一维数组。多维数组其实就是将一维数组的元素还是一维数组而已。其内存图如下:
2."不规则"数组
根据Java上述数组特性,我们可以让数组的每一行的元素个数都不相同,只需要依次对每个一维数组进行初始化即可。
代码如下:
import java.util.Arrays;
public class Test2 {
public static void main(String[] args) {
int n = 5;
int[][] odds = new int[n][]; //初始化第一维数组
for (int i = 0; i < n; i++) {
odds[i] = new int[i]; //初始化第二维数组
}
System.out.println(Arrays.deepToString(odds));
}
}
打印结果:
⭕️ 补充:使用Arrays.deepToString( )方法可以对多维数组进行打印噢!