Java实现两数交换

文章目录

  • 实现两数交换
  • 方法一、(数组的方式进行交换)
  • 方法二、(对象的方式进行交换)
  • 总结

实现两数交换

    实现两数交换,没有办法通过直接传递数字达到交换的结果,定义的int型变量是被存储在栈空间上的,在栈空间上的是无法直接通过交换达到想要的效果的,因为在栈空间上定义是变量本质上都是属于局部变量,当我们将两个数传递给交换方法时,方法内的形参用于接收,此时相当于再重新创建了两个数字,也就是说,此时在程序中创建了4个变量。

public static void func3(int a , int b) {int tmp = a;a = b;b = tmp;
}public static void main(String[] args) {int aa = 1;int bb = 2;func3(aa, bb);}

在这里插入图片描述

    此时我们再创建一个中间变量tmp用于辅助交换

在这里插入图片描述

    当程序将方法func3执行完了之后,回到main方法里面,此时两个变量交换了,但是交换的是变量a和变量b而非变量aa和变量bb,当方法func3执行完毕后,变量a和变量b会被程序回收,此时变量aa和变量bb依旧是原来的数字并没有进行交换,因此func3方法并没有实际意义上的交换,仅仅是将局部变量a和b进行交换了并没有影响到我们真正要交换的变量。

    在C语言中,想要达到两数交换的效果可以通过地址进行交换,但是在Java里面没有地址的说法,那么我们可以换一个角度想,在Java里面包含有引用型变量和基本数据类型变量,引用型变量是存储在堆空间上的,通过在栈空间上开辟一块空间用于存储堆空间的地址,这块空间有一个名字叫做引用型变量,引用型变量和C语言的地址有异曲同工之妙,引用可以看作是存储内容的地址,拿Java的数组来说,数组名就是一个引用,通过数组名就可以找到存储在堆空间上的数组进而对其进行操作。

在这里插入图片描述

    因此我们想要通过Java实现两数交换可以通过引用,将引用传递给方法,在方法内直接通过引用对变量进行操作交换

    而基本数据类型,使用基本数据类型创建的变量都是存储在栈空间上的,我们没有办法拿到栈空间的地址,而Java也没有地址的说法,因此需要将存储在栈空间上的变量通过方法进行交换,根本不可能,这也就意味着基本数据类型是无法做到两数交换的

方法一、(数组的方式进行交换)

    public static void swap(int[] array ) {int tmp = array[0];array[0] = array[1];array[1] = tmp;}public static void main(String[] args) {int[] array = {1 , 2};System.out.println(array[0] + " " + array[1]);swap(array);System.out.println(array[0] + " " + array[1]);}

    数字1和2通过数组的方式存储在堆空间上,将数组的引用传递给方法,即便是方法使用形参进行接受,方法通过形参直接操作数组的数据,并没有改变形参的指向,此时是实参和形参同时指向同一个堆空间,也就是对形参对数组的操作等同于实参对数组的操作。

在这里插入图片描述

    但是如果在方法内改变形参的指向,那么此时在方法内做的任何操作都是无用功,当在改变指向的同时,形参就再也无法直接拿到实参堆空间上的地址了,改变指向之后就会指向堆空间上新的地址,这个时候两块地址之间是没有任何联系的,因此对于新空间的操作是无法影响到实参的堆空间的,因此在实现两数交换传递实参的时候,方法内要避免更改形参的指向,

    public static void func1(int[] array) {array = new int[]{1 , 2};}public static void func2(int[] array) {array[0] = 10;}

    方法func1修改了形参的指向,因此在方法内对于形参的任何操作都不会影响到实参

在这里插入图片描述

    方法func2没有修改形参的指向,而是直接对数组进行操作,那么此时形参对数组的操作就等同于实参对数组的操作

在这里插入图片描述

方法二、(对象的方式进行交换)

    既然引用型数据类型可以进行交换,那么自定义引用类型肯定也可以,我们可以定义一个类,其中只定义一个成员变量

public class Myvalue {public int a = 20;public Myvalue(int a) {this.a = a;}
}

    再通过实例化对象,使用构造方法定义两个数据,此时我们就可以得到了两个互不相干的数据,两个对象之间是没有任何联系的,则对象内的数据也是没有任何联系的。我们再创建一个方法,形参是类类型的变量,用于存储实参传递过去的引用

    public static void swap(Myvalue myvalue , Myvalue myvalue1){}

    在方法内直接通过引用操作数据,注意要避免修改形参的指向,否则方法内所做的一切都是无用功

class my {public static void swap(Myvalue myvalue , Myvalue myvalue1){int tmp = myvalue.a;myvalue.a = myvalue1.a;myvalue1.a = tmp;}public static void main1(String[] args) {Myvalue myvalue = new Myvalue(10);Myvalue myvalue1 = new Myvalue(20);System.out.println(myvalue.a + "" + myvalue1.a);swap(myvalue , myvalue1);System.out.println(myvalue.a + "" + myvalue1.a);}

在这里插入图片描述

总结

    在Java中,因为没有地址的说法,因此无法直接通过传地址达到两数交换的效果,Java中的基本数据类型是存储在栈空间上的,而栈空间的地址是无法直接拿到的,在栈空间上存储的地址都是局部变量,当方法结束后变量就会被JVM直接回收,这也就意味着只要是存储在栈空间上的变量都无法做到两数交换。

    而我们可以通过引用型数据类型的引用型变量可以拿到存储在堆空间上面的数据,引用型变量本质上是存储堆空间的地址,因此可以通过引用改变数据,而非像基本数据类型那般只能改变自己的数据,一旦改变的是自己本身的数据那么就没有办法再操作实参的数据,只有通过一个数据去改变另外一个数据才能够达到传递给方法后形参操作数据等同于实参操作数据的效果,这也就类似于将引用传递给方法,只要方法内不改变形参的指向,那么在方法内的任何操作都可以当做是实参在进行操作。

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

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

相关文章

GOLANG+VUE后台管理系统

1.截图 2.后端工程截图 3.前端工程截图

Axure PR 9 穿梭框 设计交互

​大家好,我是大明同学。 这期内容,我们将深入探讨Axure中穿梭筛选宽元件设计与交互技巧。 穿梭筛选框元件 创建穿梭筛选框所需的元件 左穿梭筛选框 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.现在画布上创建一个背景,在元件库中…

【东莞石碣】戴尔R740服务器维修raid硬盘问题

1:石碣某塑料工厂下午报修一台戴尔R740服务器硬盘故障,催的还比较着急。 2:工程师经过跟用户确认故障的问题以及故障服务器型号和故障硬盘型号,产品和配件确认好后,公司仓库确认有该款硬盘现货,DELL 12T S…

介绍一下strncpy(c基础)

strncpy是strcpy的进阶版&#xff0c;都是把一个字符串赋值给另一个字符串。但不同的是strncpy可以选择复制几个字符&#xff08;可以完全替代strcpy&#xff09; 链接介绍一下strcpy函数&#xff08;c基础&#xff09;-CSDN博客 格式 #include<string.h> strncpy(ar…

【Pythonr入门第二讲】你好,世界

"Hello, World!" 是一种传统的编程入门示例&#xff0c;通常是程序员学习一门新编程语言时编写的第一个程序。这个程序的目标非常简单&#xff1a;在屏幕上输出 "Hello, World!" 这个字符串。尽管它非常简单&#xff0c;但具有重要的象征意义和实际价值。 …

工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程

一.背景 公司是非煤采矿业&#xff0c;核心业务是采选&#xff0c;大型设备多&#xff0c;安全风险因素多。当下政府重视安全&#xff0c;头部技术企业的安全解决方案先进但价格不低&#xff0c;作为民营企业对安全投入的成本很敏感。利用我本身所学&#xff0c;准备搭建公司的…

Windows 服务常用工具及 nssm 使用示例

Windows 将某个应用程序设为服务运行&#xff0c;确保它在后台稳定运行&#xff0c;并且在系统重启后自动启动。 常见的工具包括 Windows 自带的服务管理器、sc 命令、srvany 和第三方工具 nssm。 1.常用 Windows 服务工具 Windows 服务管理器&#xff1a;通过图形化界面&am…

汽车资讯新动力:Spring Boot技术驱动

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

头歌——vlan基本配置第二关

任务描述 本关任务&#xff1a;根据前面的实验&#xff0c;完成相应的题目测试。

深度解析FastDFS:构建高效分布式文件存储的实战指南(上)

文章目录 一、FastDFS简介1.1 概述1.2 特性 二、FastDFS原理架构2.1 FastDFS角色2.2 存储策略2.3 上传过程2.4 文件同步2.5 下载过程 三、FastDFS适用场景四、同类中间件对比4.1 FastDFS和集中存储方式对比4.2 FastDFS与其他文件系统的对比 五、FastDFS部署5.1 单机部署5.1.1 使…

LeetCode 3249.统计好节点的数目:深度优先搜索(DFS)

【LetMeFly】3249.统计好节点的数目&#xff1a;深度优先搜索(DFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-the-number-of-good-nodes/ 现有一棵 无向 树&#xff0c;树中包含 n 个节点&#xff0c;按从 0 到 n - 1 标记。树的根节点是节点 0 。给你一…

中国省级金融发展水平指数(金融机构存款余额、贷款余额、GDP)2020-2023年

数据范围&#xff1a; 包含的数据内容如下&#xff1a; 分省份金融机构存款余额、分省份金融机构贷款余额、分省份金融机构存贷款余额、分省份GDP、分省份金融发展指数 西藏自治区、贵州省、黑龙江省2023年数据暂未公布&#xff0c;计算至2022年&#xff0c;其他省份数据无缺失…

大模型(LLMs)RAG 版面分析——表格识别方法篇

大模型&#xff08;LLMs&#xff09;RAG 版面分析——表格识别方法篇 一、为什么需要识别表格&#xff1f; 表格的尺寸、类型和样式展现出多样化的特征&#xff0c;如背景填充的差异性、行列合并方法的多样性以及内容文本类型的不一致性等。同时&#xff0c;现有的文档资料不…

力扣(leetcode)题目总结——辅助栈篇

leetcode 经典题分类 链表数组字符串哈希表二分法双指针滑动窗口递归/回溯动态规划二叉树辅助栈 本系列专栏&#xff1a;点击进入 leetcode题目分类 关注走一波 前言&#xff1a;本系列文章初衷是为了按类别整理出力扣&#xff08;leetcode&#xff09;最经典题目&#xff0c…

【python系列】python数据类型的分类和比较

一、数据类型的定义 在程序设计的类型系统中,数据类型(英语:Data type),又称资料型态、资料型别,是用来约束数据的解释。——Wikipedia 从定义我们可以看出来,数字类型的理解最主要的是约束数据的解释,每个类型都有他们自己所使用得场景,这个就是数字类型的分类,分类…

【JavaSE】【多线程】阻塞队列

目录 一、阻塞队列1.1 生产者消费者模型1.2 Java提供的阻塞队列1.3 实现一个简单生产者消费者模型 二、自己实现阻塞队列2.1 成员变量2.2 构造方法2.3 put方法2.4 take方法2.5 最终代码 一、阻塞队列 阻塞队列&#xff1a;是一种特殊的队列&#xff0c;也有先进先出的特性。它…

【pytest】pytest注解使用指南

前言&#xff1a;在 pytest 测试框架中&#xff0c;注解&#xff08;通常称为装饰器&#xff09;用于为测试函数、类或方法提供额外的信息或元数据。这些装饰器可以影响测试的执行方式、报告方式以及测试的组织结构。pytest 提供了多种内置的装饰器&#xff0c;以及通过插件扩展…

el-table合并单元格之后,再进行隔行换色的且覆盖表格行鼠标移入的背景色的实现

el-table 中有现成的隔行换色功能&#xff0c;只要增加 stripe 属性即可。但是如果有单元格合并的话&#xff0c;这个属性就不可用了。这时候我们就需要动点小心思了。 基于相同字段进行合并 单元格合并&#xff1a;基于表头中的某一列&#xff0c;具有相同值的个数相加进行合…

OpenAI模型whisper 音频转文本

最近有一个音频转文本的需求&#xff0c;了解到了OpenAI的whisper模型可以实现。 Whisper 是 OpenAI 提供的一个通用语音识别模型&#xff0c;支持多语言的音频转文本功能&#xff0c;并具有较高的准确性。它的主要用途包括自动语音识别 (ASR)、语言翻译&#xff08;将音频直接…

ubuntu下连接了192.168.1.x和192.168.2.x两个网络段,如何让这个两个网段互相通信?

在 Ubuntu 上连接两个网络段&#xff08;如 个人终端A 192.168.1.10 和 个人终端B 192.168.2.10&#xff09;&#xff0c;需要配置路由和网络转发功能&#xff0c;使这两个网段能够相互通信。以下是实现方法&#xff1a; 步骤 1&#xff1a;确认网络配置 1. 确保 Ubuntu 机器…