当前位置: 首页 > 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…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...