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

看到这句话的时候证明:此刻你我都在努力
加油陌生人
微信图片编辑_20240229212205.png
个人主页:Gu Gu Study
专栏:一步一步了解Java

喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹


喜欢的话可以点个赞谢谢了。


数组

数组是一推相同数据类型组合在一起的集合,数组是引用类型数据,比如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];

讲解完定义方法我们可以在思考一下接下来的打印结果:会不会打印数组出来呢?
然后下面是输出的结果:
image.png
很显然从打印结果来看,编译器并没有把数组打印出来,而是打印出了一串数字,符号和字母的组合,那么这是什么呢?这时候我就又要把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();}

image.png
需要注意的是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));}

image.png


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()));
}

image.png

  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));}
}

image.png
如上代码:可能大家伙又感到奇怪了,怎么好像有打印出地址了?还有第三种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]));}

image.png

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

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));
}

image.png

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据迁移利器登场!Elasticdumpv6.110震撼发布,助你轻松搬迁大数据!

简介 Elasticdump 是一个用于导出和导入 Elasticsearch 数据的工具。它能够从一个 Elasticsearch 集群读取数据并写入到另一个 Elasticsearch 集群、文件系统或其他数据存储&#xff08;例如 S3&#xff09;。这个工具非常有用&#xff0c;特别是在进行数据迁移、备份和恢复操作…

2024年学浪视频怎么下载到手机相册

随着2024年的到来&#xff0c;学浪平台继续为广大学习者提供优质的在线教育资源。然而&#xff0c;如何将这些宝贵的视频内容下载到手机相册&#xff0c;方便随时离线观看呢&#xff1f;无论您是想在旅途中学习&#xff0c;还是希望在没有网络的情况下复习课程&#xff0c;本文…

1106 2019数列

solution 维护长度为4的数组&#xff0c;对于第四位之后的数字&#xff0c;为所维护数组的所有元素之和 的个位数 #include<iostream> using namespace std; int main(){int n, a[4] {2, 0, 1, 9}, cnt 0, d;scanf("%d", &n);for(int i 0; i < n; …

kettle从入门到精通 第六十三课 ETL之kettle kettle调用python脚本的两种方法

想真正学习或者提升自己的ETL领域知识的朋友欢迎进群&#xff0c;一起学习&#xff0c;共同进步。若二维码失效&#xff0c;公众号后台加我微信入群&#xff0c;备注kettle。 kettle中不能直接调用python脚本&#xff0c;可以通过shell脚本和http进行调用pyton服务。 一、shel…

Golang | Leetcode Golang题解之第97题交错字符串

题目&#xff1a; 题解&#xff1a; func isInterleave(s1 string, s2 string, s3 string) bool {n, m, t : len(s1), len(s2), len(s3)if (n m) ! t {return false}f : make([]bool, m 1)f[0] truefor i : 0; i < n; i {for j : 0; j < m; j {p : i j - 1if i >…

C++的数据结构(十八):并查集

并查集&#xff08;Union-Find&#xff09;是一种用于处理一些不交集&#xff08;Disjoint Sets&#xff09;问题的数据结构。它主要支持两种操作&#xff1a;合并集合&#xff08;Union&#xff09;和查找元素所属集合&#xff08;Find&#xff09;。在解决诸如连通性问题、网…

Ruoyi框架学习——权限管理

权限分类 菜单权限&#xff1a;用户登录系统之后能看到哪些菜单按钮权限&#xff1a;用户在一个页面上能看到哪些按钮&#xff0c;比如新增、删除等按钮接口权限&#xff1a;用户带着认证信息请求后端接口&#xff0c;是否有权限访问&#xff0c;该接口和前端页面上的按钮一一对…

AI生成内容检测|Fast-DetectGPT:通过条件概率曲率对机器生成文本进行有效的零样本检测

【摘要】大型语言模型 (LLM) 已显示出生成流畅且有说服力的内容的能力&#xff0c;这既带来了生产力机会&#xff0c;也带来了社会风险。要构建值得信赖的 AI 系统&#xff0c;必须区分机器生成的内容和人类创作的内容。领先的零样本检测器 DetectGPT 展示了值得称赞的性能&…

Github 2024-05-25 Rust开源项目日报Top10

根据Github Trendings的统计,今日(2024-05-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Svelte项目1TypeScript项目1Python项目1Go项目1Dart项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust…

如果有多个文件夹,怎么快速获得文件夹的名字呢

上一篇写到怎么批量建立文件夹&#xff0c;那么怎么获取批量文件夹的名字呢&#xff1f; 一、啊这&#xff0c;这真是一个好问题二、这个得用Python&#xff08;文本末尾有打包程序&#xff0c;点击链接运行就可以了&#xff09;&#xff08;1&#xff09;首先建立一个py文件&a…

博客系统(Servlet实现)

目录 1.准备工作 2.数据库设计 2.1表设计 2.2封装数据库操作代码 2.3创建 Blog 类 和 User 类 2.4创建 BlogDao 类和 UserDao 类 3.读取博客列表功能 3.1约定前后端交互接口 3.2实现服务器代码 3.3实现客户端代码 4.实现博客详情 4.1约定前后端交互接口 4.2实现服…

AGI技术与原理浅析:曙光还是迷失?

前言&#xff1a;回顾以往博客文章&#xff0c;最近一次更新在2020-07&#xff0c;内容以机器学习、深度学习、CV、Slam为主&#xff0c;顺带夹杂个人感悟。笔者并非算法科班出身&#xff0c;本科学制药、研究生学金融&#xff0c;最原始的算法积累都来源于网络&#xff0c;当时…

乡村振兴与乡村文化传承创新:保护和传承乡村文化,推动乡村文化创新发展,打造具有文化魅力的美丽乡村

一、引言 在当代中国&#xff0c;乡村振兴已成为国家发展的重要战略之一。乡村不仅是自然资源的富集地&#xff0c;更是中华优秀传统文化的发源地。保护和传承乡村文化&#xff0c;推动乡村文化创新发展&#xff0c;对于打造具有文化魅力的美丽乡村&#xff0c;实现乡村全面振…

SSMP整合案例第三步 业务层service开发及基于Mybatis的接口功能拓展

业务层开发 对于业务层的制作有个误区 Service层接口定义与数据层接口定义具有较大差别 不要混用 业务层接口关注的是业务名称 数据层接口关注的是数据层名称 操作是不难 但是有些东西还是要掌握的 业务层接口如果是业务方法 就按照业务名称来代替 如果是数据操作 直接用…

本地部署Whisper实现语言转文字

文章目录 本地部署Whisper实现语言转文字1.前置条件2.安装chocolatey3.安装ffmpeg4.安装whisper5.测试用例6.命令行用法7.本地硬件受限&#xff0c;借用hugging face资源进行转译 本地部署Whisper实现语言转文字 1.前置条件 环境windows10 64位 2.安装chocolatey 安装chocol…

mysql驱动版本变更导致查询数据结果一直是空

1 引言 最近接手了一个已离职同事的java项目&#xff0c;这个项目中原来使用了自己的mysql驱动版本&#xff0c;并未使用公司公共依赖中的版本号。我想为了统一版本号&#xff0c;就将当前项目中pom文件中mysql的版本号verson给去除了。没怎么自测&#xff0c;就直接发到测试环…

免费的八字软件

无敌八字排盘软件完全免费使用&#xff0c;即使用不需要付费且无任何限制。同时推出手机版电脑版&#xff0c;两版本数据互通互用&#xff0c;即电脑版的数据可以备份到手机版上导入&#xff0c;手机版的数据也可以备份到电脑版上恢复导入&#xff0c;方便手机和电脑共用的朋友…

Golang实现递归复制文件夹

代码 package zdpgo_fileimport ("errors""os""path/filepath""strings" )// CopyDir 复制文件夹 // param srcPath 源文件夹 // param desPath 目标文件夹 // return error 错误信息 func CopyDir(srcPath, desPath string) error {…

Android-自定义三角形评分控件

效果图 序言 在移动应用开发中&#xff0c;显示数据的方式多种多样&#xff0c;直观的图形展示常常能带给用户更好的体验。本文将介绍如何使用Flutter创建一个自定义三角形纬度评分控件&#xff0c;该控件可以通过动画展示评分的变化&#xff0c;让应用界面更加生动。 实现思…

转行3年涨薪300%,我总结了一套产品经理快速入门指南!

想转行的产品小白&#xff0c;初期一定会遇到这个问题——我要如何 0 基础转行产品经理&#xff1f; 要想 0 基础快速转行产品经理&#xff0c;我通过个人实践总结了 5 个关键点&#xff0c;可以参考。 一、熟悉产品经理的工作全流程 转行的产品小白&#xff0c;首先要建立产…