【重识Java】你这 数组 挺能藏啊?

发布于:2022-12-20 ⋅ 阅读:(316) ⋅ 点赞:(0)

本文主要介绍一些关于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( )方法可以对多维数组进行打印噢!

本文含有隐藏内容,请 开通VIP 后查看