Java中的数组注意点


对于数组这块相信兄弟们在C语言那边已经玩的透透的了,那么对于我们Java数组这块上手问题应该不大,阿涛就给兄弟们挑选重难点过一遍!

一维数组

首先我再问兄弟们一个我之前就问过的问题,我们为什么要使用数组?其实这个问题是可以用数组的定义来回答的:数组是我们用来存储一系列相同类型的数据的集合!假如我们要得到从一到一百这一百个数据,难道我们还需要一个一个定义下去?这时候我们使用一个数组不就很灵性了吗?

数组的创建及初始化

int arr[10];

这是不是我们C语言中数组的定义方法?悄悄告诉你们,在VS2019中你把鼠标悬停在这个数组上面,它显示出的数据类型是这个:int 【】。所以说,无论是C语言还是Java,int [ ]才是正统!这才是真正的类型!而且这个数组类型还是不可以被破坏的!

        int[]arr={1,2,3,4};
        int[]brr=new int[]{1,2,3,4};
        int[]crr=new int[4];

我们可以看到,关于数组我们这三种定义方法,第一种和第二种本质上是一个意思,第三种就是意味着我们先整理好4个整型的内存,静待有人入主,这种不赋初始值的情况下,每一个元素都会给一个默认值:
在这里插入图片描述
回到我们数组定义初始化上面来:有没有发现不管什么情况:在这里插入图片描述
我们定义数组时都不会往【】里面放数字呢?原因也不难理解:我们int 【】本身就是数组类型,不管你往【】里面放什么东西,都是会破坏这个数据类型的,这是绝对不被允许的;再者就是右边的部分:
在这里插入图片描述
发现没,除了第三个是因为不给数组初始化所以没有加上{ },此时我们为了确认这个数组的大小,才不得不给【】加上了这个数组的元素个数,其余的是不是也没有再【】加上元素个数?我是这样理解的{ }和【里面的数字不共戴天】,只要有{ }就不可以往【】里面加数字!
那么对于数组我们自然而然想到了,既然这里不像C语言那样通过【】里面的数字确定我们的数组元素个数,那我们是怎样确认个数的呢?其实我们数组的初始化也就相当于一个赋值呗,赋值是从右边往左边赋值的,这样子我们是不是在书写右边的时候其实已经就能够确认数组元素个数了呢?

数组的使用

我们千辛万苦把数据存放到了数组里面可不是为了玩的,当然是为了使用这些数据啦!那我们该如何把数据从数组中拿出来呢?这跟我们C语言的数组的使用是高度相似的:

    public static void main(String[] args) {
        int[]arr={1,2,3,4};
        for (int i=0;i<4;i++){
            System.out.println(arr[i]);

在这里插入图片描述
高度相似不等于完全一样,之前我们就说过Java是一个极其安全的语言,就比如在C语言中,数组越界了可能会给你一个警告,甚至于还有可能真的被你访问到了那个越界位置的数据,访问到了并不代表你的使用是规范的,但是对于我们的Java,一切都是安全第一:
在这里插入图片描述
数组越界错误这不就来了吗……
在之前我们遍历数组的方法一般就是用一个循环,然后通过数组下标的增大,按序访问到各个数组的值,在我们Java中还有另外一种for each循环:
在这里插入图片描述
我们的Ideal在某些程序上就是为了让我们程序猿忙里偷闲的,所以一些操作都给你安排的明明白白的,就比如我们这里的for each你只要按下回车键就会自动生成:

        for (:
             ) {
            
        }

自动生成的格式比较凌乱,但是我们是可以自主调整的:

        int[]arr={1,2,3,4};
        for (int x:arr) {
            System.out.println(x);
            
        }

在这里插入图片描述
左边(定义一个变量来接收我们数组的每个元素):右边(放我们的数组名称),这样子的效果实际上就是这个x在一次循环中接收到的就是一个数组元素,然后进行打印,接着进入下一次循环x接收的就是下一个元素,如此循环……作为一名Java程序猿,我们可以极大程度的享受到Java带给我们的便利,我们不需要知道for each是如何找到下一个元素,又是如何接收的,我们只需要会使用即可!但是我们需要知道的一点就是,使用for each循环是不可以拿到数组元素的下标的,所以当我们是没有对下标的业务需求的时候我们,是可以考虑使用for each循环的。

数组是引用类型

好久之前我们就说过在Java中是没有地址一说的,我们的Java不是那么底层的语言,我们自己是拿不到一个变量的地址的,之前我们也提过一嘴,数据分为基本数据类型和引用数据类型,而引用变量存放的实际上就是对象的地址,而我们数组就属于引用类型!!!
在这里插入图片描述
手绘的一张图,可能有一点小丑,但是绝对够我们用的了!

int【】arr=new int【】{123}

就拿这么简单的一行代码来说:我们之前也说过,Java里面一切皆是对象,我们可以通过new 关键字,给自己创建无数个对象,那么我们的对象创建出来就会存放在堆上面,而此时我们的arr是一个局部变量,局部变量都是存放在栈上面的,我们的arr此时也可以叫做引用对象,或者引用!一个对象可以同时被很多引用指向,当没有一个引用指向我们的对象时,堆上的对象也就会被程序回收。

int【】arr={123}int【】arr1=arr;

大致是这么一种情况:
在这里插入图片描述
引用变量只是说明这个变量存放的是一个引用,引用变量也是局部变量,局部变量就应该存放在栈区上;与之相对的我们的对象就是要存放在堆区上面的!
那么我有一个问题:对于我上面的第二行代码,我们就这那个赋值操作说,一个引用指向了另一个引用?当然是不可以的!!通过我们那个图片也应该清楚,赋值操作仅仅是让arr1这个引用里面存放了数组的地址,所以我们只能说一个引用指向了另外一个引用所指向的对象!!

null“空引用”

看到这个null我们才会知道什么是三十年河东,三十年河西啊!遥想当年,在C语言里面,咱还是叫空指针的那段峥嵘岁月,好不潇洒,哪像现在沦落到只能使用小写……
不过没事,虽然我们降级了,但是我们的工作强度那还是丝毫没减啊,纯纯用爱发电了属于是……

        int[]arr=null;
        arr[0]=1;

在这里插入图片描述

// */
public class Test {

    class Person{
        int name;
    }
    public static void main(String[] args) {
        Person person=null;
        person.name=0;

在这里插入图片描述
兄弟们看看,无论是数组的访问,还是成员变量的访问,只要我们的引用被赋值为null,此时都会有一个空引用异常!空引用,表示我们这个引用并不指向任何对象,既然本来无一物,那何处惹尘埃?他没有这个实力啊!!

分清改变引用的指向和改变引用指向对象的成员

别看我的标题这么长一段,但是解释起来却是异常轻松:我们只要想一想之前的指针是如何理解的不就好了?

    public static void func(int[]arr){
        int[]tmp={3,4,5,6,7};
        arr=tmp;
//        arr[0]=tmp[0];
    }
    public static void main(String[] args) {
        int[]arr={1,2,3,4,5};
        System.out.println(Arrays.toString(arr));
        func(arr);
        System.out.println(Arrays.toString(arr));

在这里插入图片描述

    public static void func(int[]arr){
        int[]tmp={3,4,5,6,7};
//        arr=tmp;
        arr[0]=tmp[0];
    }

在这里插入图片描述
在这里插入图片描述

相信以兄弟们的才华应该是能够看得懂这几张图的!
总之,不要以为我们传参也好,给引用赋值也罢,就能够真正达到我们想要的效果;关键还是要看,我们到底是要改变这个引用的指向,还是想通过这个引用访问到对象中的数据!

二维数组

二维数组的定义和使用

有了C语言中关于数组的学习,加上刚才阿涛给兄弟们补齐的这些Java数组,兄弟们学一个小小的二维数组还不是手到擒来?
我们上来先将重点:二维数组其实就是一个特殊的一维数组!在Java中有着尤为特别的体现!
在C语言中我们可以省略行但是不可以省略列,但是在Java中却是正好反着来的!

        int[][]arr1={{1,2},{3,4}};
        int[][]arr2=new int[2][3];
        int[][]arr3=new int[2][];

我们可以看到二维数组的这三种定义方法,总体上来说还是有了{ },那么【】里面就不能填数字!
那兄弟们应该是可以无障碍读懂第一行的,对于下面两行有缺失的数组,最大的疑惑可能就是如何去使用这个缺胳膊少腿儿的同志吧。
第二行,我们直接遍历数组就可以进行赋值操作了,那么关键是第三行,我们该如何确定它的列数呢?Java是用来服务程序猿的一门语言,所以它的列数由你来确定!

        arr3= new int[2][];
        arr3[0]=new int[2];
        arr3[1]=new int[3];
        System.out.println(arr3.length);
        System.out.println(arr3[0].length);
        System.out.println(arr3[1].length);
        System.out.println();

在这里插入图片描述
最后呢我们再来讲一下如何快速打印一个二维数组吧!

        System.out.println(Arrays.deepToString(arr1));
        System.out.println(Arrays.toString(arr2));

上面的可以打印一个而二维数组,下面的可以打印一个一维数组:()里面的方法其实就是编译器自己实现的一个能够将数组转换为字符串的方法!我们日后完全可以自己实现!

希望我的这篇博客能够或多或少帮助到兄弟们!
还是那句话,百年大道,你我共勉!!!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值