当前位置: 首页 > news >正文

【一步一步了解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中已经把二维数组是由一维数组拼接而成这句话给表现得淋漓尽致。

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

相关文章:

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

看到这句话的时候证明&#xff1a;此刻你我都在努力加油陌生人个人主页&#xff1a;Gu Gu Study专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 数组 数组是一推相同数据…...

2024年5月份最新独角数卡使用USDT详细小白教程

直观配套视频教程 2024年5月份最新独角数卡安装及USDT使用详细小白教程 1、创建服务器 Centos或者Ubuntu2、宝塔面板开心版安装寶塔 Linux 面版 8.0.5 開心版 - 2024年1月12日 - 开心专区 - 异次元 - Powered by Discuz!Centos安装命令&#xff08;默认安装是 8.0.1 直接在线升…...

【idea】idea2024最新版本下载_安装_破解

1、下载 下载地址&#xff1a;下载 IntelliJ IDEA – 领先的 Java 和 Kotlin IDE 下载完成&#xff1a; idea破解脚本下载链接&#xff1a;https://pan.baidu.com/s/1L5qq26cRABw8XuEn_CngKQ 提取码&#xff1a;6666 下载完成&#xff1a; 2、安装 1、双击idea的安装包&…...

部署CNI网络组件+k8s多master集群部署+负载均衡

一、环境部署 主机服务 192.168.91.5 K8S集群master01192.168.91.8 K8S集群master02192.168.91.6K8S集群node01192.168.91.7K8S集群node02192.168.91.9 负载均衡nginxkeepalive01&#xff08;master&#xff09;192.168.91.10 负载均衡nginxkeepalive02&#xff08;backup&am…...

一个和蔼可亲的Python库,用Gooey为你的程序添加GUI

大家好&#xff0c;你有没有遇到过这样的情况&#xff1a;你写了一个非常棒的命令行程序&#xff0c;但当你分享给朋友或同事时&#xff0c;他们却因为害怕命令行而不愿意使用&#xff1f;这时候&#xff0c;一个简洁美观的图形用户界面&#xff08;GUI&#xff09;就派上用场了…...

java抽象类,接口,枚举练习题

第一题&#xff1a; 答案&#xff1a; class Animal{//成员变量protected String name;protected int weight;//构造方法public Animal(){this.name"refer";this.weight50;}public Animal(String name,int weight){this.namename;this.weightweight;}//成员方法publ…...

探索Python技巧:零基础学习缩进与逻辑关系

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、理解Python的缩进语法 缩进规则详解 二、缩进在逻辑关系中的应用 逻辑块示例 三、实…...

【设计模式】JAVA Design Patterns——Callback(回调模式)

&#x1f50d;目的 回调是一部分被当为参数来传递给其他代码的可执行代码&#xff0c;接收方的代码可以在一些方便的时候来调用它。 &#x1f50d;解释 真实世界例子 我们需要被通知当执行的任务结束时。我们为调用者传递一个回调方法然后等它调用通知我们。 通俗描述 回调是一…...

Pandas高效数据清洗与转换技巧指南【数据预处理】

三、数据处理 1.合并数据&#xff08;join、merge、concat函数&#xff0c;append函数&#xff09; Concat()函数使用 1.concat操作可以将两个pandas表在垂直方向上进行粘合或者堆叠。 join属性为outer&#xff0c;或默认时&#xff0c;返回列名并集&#xff0c;如&#xff…...

kafka防止消息丢失配置

无消息丢失最佳实践配置&#xff1a; 不要使用 producer.send(msg)&#xff0c;而要使用 producer.send(msg, callback) API。设置 acks all。是 Producer 参数。设置成 all&#xff0c;表明所有副本 Broker 都要接收到消息&#xff0c;g该消息才算是“已提交”。设置 retrie…...

Socket CAN中ctrlmode有哪些?

在Linux中,socketcan 的 ctrlmode 是一个用于配置CAN设备控制模式的标志字段。该字段的值由一组标志位组成,这些标志位控制CAN设备的各种操作模式。以下是一些常见的 ctrlmode 标志及其含义: CAN_CTRLMODE_LOOPBACK: 描述:启用回环模式。作用:设备在发送帧的同时会接收它…...

find 几招在 Linux 中高效地查找目录

1. 介绍 在 Linux 操作系统中&#xff0c;查找目录是一项常见的任务。无论是系统管理员还是普通用户&#xff0c;都可能需要查找特定的目录以执行各种操作&#xff0c;如导航文件系统、备份数据、删除文件等。Linux 提供了多种命令和工具来帮助我们在文件系统中快速找到目标目…...

【ELK日志收集过程】

文章目录 为什么要使用ELK收集日志ELK具体应用场景ELK日志收集的流程 为什么要使用ELK收集日志 使用 ELK&#xff08;Elasticsearch, Logstash, Kibana&#xff09;进行日志收集和分析有多种原因。ELK 堆栈提供了强大、灵活且可扩展的工具集&#xff0c;能够满足现代 IT 系统对…...

设计模式—23种设计模式重点 表格梳理

设计模式的核心在于提供了相关的问题的解决方案&#xff0c;使得人们可以更加简单方便的复用成功的设计和体系结构。 按照设计模式的目的可以分为三大类。创建型模式与对象的创建有关&#xff1b;结构型模式处理类或对象的组合&#xff1b;行为型模式对类或对象怎样交互和怎样…...

Vue学习穿梭框Transfer组件

Vue学习Transfer组件 一、前言1、案例一2、案例二 一、前言 在 Vue 3 中使用 el-transfer 组件可以帮助你实现数据的穿梭功能&#xff0c;让用户可以将数据从一个列表转移到另一个列表。下面是一个简单示例&#xff0c;演示如何在 Vue 3 中使用 el-transfer 组件&#xff1a; …...

Android 项目中自定义多个 RadioButton 并排一列选择效果实现

文章目录 1、静态版实现1.1、实现要求1.2、实现步骤1.3、代码实现1.4、代码实现说明1.5、结论 2、项目版实现(动态)1、先看效果图2、main的布局文件3、定义RadioButton的属性4、最后在代码中生成我想要的东东5、说明 3、后续优化方向 1、静态版实现 1.1、实现要求 我们需要在…...

解决win系统msvcp140.dll丢失的多种常用方法,亲测有效!

msvcp140.dll 是一个重要的Windows系统文件&#xff0c;属于Microsoft Visual C Redistributable runtime components的一部分&#xff0c;特别与Visual Studio 2015及之后版本编译的C应用程序相关联。这个动态链接库&#xff08;DLL&#xff09;文件包含了一系列C标准库的功能…...

使用keepalived实现mysql主从复制的自动切换

使用Keepalived实现MySQL主从复制的自动切换通常涉及配置一个虚拟IP&#xff08;VIP&#xff09;作为MySQL服务器对客户端的访问点。Keepalived会监控MySQL主服务器的健康状况&#xff0c;如果主服务器宕机&#xff0c;Keepalived会自动将虚拟IP移至备用服务器&#xff0c;从而…...

数据库(4)——DDL数据库操作

SQL标准没有提供修改数据库模式定义的语句&#xff0c;用户想修改次对象只能将它删除后重建。 查询 查询所有数据库&#xff1a; SHOW DATABASES; 在安装完MySQL数据库之后&#xff0c;自带了4个数据库&#xff0c;如下图&#xff1a; 创建数据库 数据库的创建语言为 CREATE…...

C#基础一

使用Visual Studio 2022&#xff08;VS2022&#xff09;编写C#控制台程序 1. 安装Visual Studio 2022 确保已安装Visual Studio 2022。如果未安装&#xff0c;请从Visual Studio官网下载并安装。 另一篇文章中已经有详细描述&#xff0c;这里就不在细说了。 VisualStudio2022…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...