【一步一步了解Java系列】:何为数组,何为引用类型

简介: 【一步一步了解Java系列】:何为数组,何为引用类型

看到这句话的时候证明:此刻你我都在努力

加油陌生人

1.png

数组

数组是一推相同数据类型组合在一起的集合,数组是引用类型数据,比如int[10] arr; 就是一个储存着10个int类型的一个集合,这就是数组。


那么数组有什么用呢?它存在的意义是什么呢?

在我看来数组的作用就像我们生活中用来装各种种类的盒子,比如有些盒子是装一些笔,有些是装一些书,有些是在装一些化妆品等等,他们的作用无非就是让我们使用时更加方便,不会因为分散而到处去找。数组也是一样的作用,极大减少了我们程序员对数据寻找去使用的时间。为我们更好的储存数据。比如:我们的通讯录也是运用数组来完成的。

一维数组

一维数组是数组中比较简单的数组,那么他和C语言的数组一样吗?今天我们就对标一下C语言中的数组,来探索一下Java中的数组与C语言中的数组有何不同?


我们可以看一下下面这一段代码:

public static void main(String[] args) {
    int[] arr1={1,2,3,45};
    int[] arr2=new int[]{1,2,3,45,6};
    int[] arr3=new int[10];
    System.out.println(arr1);
    System.out.println(arr2);
    System.out.println(arr3);

    

}

首先我们看一下上面的三种一维数组的定义方法,其中第一第二种其实可以说是同一种,这两种方法就是在定义数组的同时给数组进行初始化,大家也看到第二种比第一种的写法较为繁杂,但效果都是一样的,所以我们建议如果直接给数据初始化的话我们用第一种定义方法即可。

然后就是第三种方法就是定义一个元素长度为10的数组。与C语言不同在C语言中如果要定义一个元素长度为10的整形数组的代码是:int arr[10];

讲解完定义方法我们可以在思考一下接下来的打印结果:会不会打印数组出来呢?

然后下面是输出的结果:


很显然从打印结果来看,编译器并没有把数组打印出来,而是打印出了一串数字,符号和字母的组合,那么这是什么呢?这时候我就又要把C语言扯出来说事了。


其实这就类似C语言中的数组的地址,可能有小伙伴就比较疑惑了,不是说Java中没有地址吗?

emmm,按我的理解的话,Java并非没有地址,而是不运用地址,Java中是没有对数据地址操作的相关操作,也就是不用地址对程序进行处理。


那么我们该如何打印出来呢?

第一种方法:对数组的每个成员元素进行遍历打印。arr1.length可以得到数组的长度

如下:

public static void main(String[] args) {
    int[] arr1={1,2,3,45};
    int[] arr2=new int[]{1,2,3,45,6};
    int[] arr3=new int[10];
    System.out.println(arr1);
    System.out.println(arr2);
    System.out.println(arr3);



    for (int i = 0; i <arr1.length ; i++) {
        System.out.print(arr1[i]+" ");

    }
    System.out.println();
    for (int i = 0; i <arr2.length ; i++) {
        System.out.print(arr2[i]+" ");

    }

    System.out.println();

    for (int i = 0; i <arr3.length ; i++) {
        System.out.print(arr3[i]+" ");

    }
    System.out.println();
    
    }

需要注意的是arr3我们是对它定义的方法没有给它赋初值,所以默认数组里面的值全为0

第二种方法:利用我们Java中现成包的输出方法——将数组转化为字符串进行输出。

如下:

public static void main(String[] args) {
    int[] arr1={1,2,3,45};
    int[] arr2=new int[]{1,2,3,45,6};
    int[] arr3=new int[10];
    System.out.println(arr1);
    System.out.println(arr2);
    System.out.println(arr3);


    System.out.println(Arrays.toString(arr1));
    System.out.println(Arrays.toString(arr2));
    System.out.println(Arrays.toString(arr3));
    
    }


Java中数组是引用类型

首先我们要说Java中数组与C语言数组有什么区别,那么这里就要谈到引用。

对标一下C语言数组的区别Java中的数组有什么不同呢?

  1. Java中数组是可以做为返回类型的
public static int[] func1(){
    int[] arr={1,2,3,4,5,6};
    for (int i = 0; i <arr.length ; i++) {
        arr[i]*=2;
    }
    return arr;
}


public static void main(String[] args) {
    System.out.println(Arrays.toString(func1()));
}

  1. Java中的数组是储存的元素是存放在堆区上,而数组名存放在栈区指向堆区的那块储存元素的地址,在Java中叫做引用。


三、局部数组变量本身在方法结束时,变量本身是会被销毁的,但数组本身的元素可能还是会存在于内存中。如果数组中的元素是对象,且对象没有被其它引用所引用,那么它就会可能会被Java内部的垃圾回收器回收,可理解为C语言中的free函数。


扩展:引用类型可以是null,他表示空引用。 基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值; 而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。

数组的一些方法使用

一、转化为字符串

public static void main(String[] args) {
    int[] arr={1,23,4,5,6};
    String a=Arrays.toString(arr);
    System.out.println(a);
}

二、数组的拷贝方法

public static void main(String[] args) {
    int[] arr1={1,2,3,45,};

    int[] arr2=Arrays.copyOf(arr1,arr1.length);
    
    System.out.println(Arrays.toString(arr2));    //注意这里arr1与arr2不是同一个数组
                                                    // 这里copyOf创建出了一个新的数组
    


}


三、数组的排序方法

public static void main(String[] args) {
    int[] arr={21,12,4,7,33,98,56,1};
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));
}


二维数组

二维数组与一维数组有什么区别呢?

在我看来二维数组就是一个比较长的一维数组,他是几个一维数组的拼接。实际上在内存中二维数组就是一维数组似的一整块,只不过给这个二维数组在一些地方分割了。

相信我这么讲是比较抽象的,下面我就用一些代码和图解让大家更好理解我上面的话:

上图中我用了arr[2][3]举例画出了,两种二维数组的储存图,那么为了加深记忆我接下来会给大家再次举几个代码的例子:

public static void main(String[] args) {
       int[][] arr1={{1,2,3,4},{12,4,6,8}};
       int[][] arr2=new int[2][3];
       int[][] arr3=new int[2][];   //不规则二维数组


        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.toString(arr2));
        System.out.println(Arrays.toString(arr3));
    }
}


如上代码:可能大家伙又感到奇怪了,怎么好像有打印出地址了?还有第三种arr3的定义方式是怎么回事?

其实我们只需要牢记:二维数组就是由几个一维数组拼接而成。那么这里打印的就是那三个二维数组里的6个一维数组的地址了。

当然我们发现arr3的顶义方式是与C语言截然不同的,Java中可以省略列,不能省略行,而C语言则相反。

而且打印出来时两个空引用,这说明了这个二维数组的拼接的那两个二维数组还没有引用到堆区的一块数组。所以我们叫他”不规则二维数组“。


那么该如何正确打印二维数组呢?

两种方法:

第一种方法:将二维数组拆分为一维数组,在用一维数组的打印方法打印出来,二位数组中arr.length就是求二维数组中的行,也就是有几个一维数组。

public static void main(String[] args) {
   int[][] arr1={{1,2,3,4},{12,4,6,8}};
   int[][] arr2=new int[2][3];
   int[][] arr3=new int[2][];   //不规则二维数组

    for (int i = 0; i <arr1.length ; i++) {
        System.out.println(Arrays.toString(arr1[i]));

    }


    System.out.println("-----------------------");

    
    for (int i = 0; i <arr2.length ; i++) {
        System.out.println(Arrays.toString(arr2[i]));

    }

第二种方法:还是用现成包的方法转化为字符串进行输出。

public static void main(String[] args) {
    int[][] arr1={{1,2,3,4},{12,4,6,8}};
    int[][] arr2=new int[2][3];


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

从开始讲二维数组,到现在,其实可以得到一个总结:在Java中已经把二维数组是由一维数组拼接而成这句话给表现得淋漓尽致。

好了这次数组的知识就到这里了。喜欢的话就点个赞吧。

目录
相关文章
|
27天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
3天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
372 16
|
19天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
6天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
21天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
23天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2594 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
5天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
182 2
|
3天前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
105 65
|
7天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
332 2
|
23天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1580 17
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码