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,一经查实,立即删除!

相关文章

人工智能在金融领域的应用与风险防范研究

人工智能在金融领域的应用与风险防范研究 摘要:随着人工智能技术的不断进步,其在金融领域的应用日益广泛,同时也带来了新的风险与挑战。本文首先分析了人工智能在金融领域的主要应用场景,如智能投顾、信贷风险评估和反欺诈等。接着…

数据结构(二)线性表

线性表,也称为线性结构,是数据结构中的一种基本类型,其特点是数据元素之间存在一对一的线性关系。线性表通常可以用数组(顺序存储)或链表(链式存储)来实现。线性表的特点是数据元素的排列呈现线…

SQLite3 JDBC Java工具类

最近生产环境mysql各种无法使用,要求下线。有一堆小工具,平时因为mysql用着方便,配置啊,临时的一些比对数据存在里面。迁移很麻烦。 发现SQLite 3.47.0版本之后,性能大增,支持多线程,记录级锁。…

招聘和面试

本篇内容是根据2019年4月份#82 Hiring and job interviews音频录制内容的整理与翻译 小组成员 Mat Ryer、Ashley McNamara、Johnny Boursiquot 和 Carmen Andoh 讨论了受聘、雇用和工作面试的过程。如果人是团队中最重要的部分,我们如何选择与谁一起工作&#xff1…

【代码随想录|回溯算法排列问题】

491.非减子序列 题目链接. - 力扣(LeetCode) 这里和子集问题||很像,但是这里要的是非递减的子序列,要按照给的数组的顺序来进行排序,就是如果我给定的数组是[4,4,3,2,1],如果用子集||的做法先进行排序得到…

GOLANG+VUE后台管理系统

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

Axure PR 9 穿梭框 设计交互

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

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

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

summernote富文本批量上传音频,视频等附件

普通项目,HTML的summernote富文本批量上传音频,视频等附件(其他附件同理) JS和CSS的引入 <head><th:block th:include"include :: summernote-css" /> </head> <body><th:block th:include"include :: summernote-js" /> …

介绍一下strncpy(c基础)

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

1065 A+B and C (64bit) (20)

Given three integers A, B and C in (−2^63,2^63), you are supposed to tell whether AB>C. Input Specification: The first line of the input gives the positive number of test cases, T (≤10). Then T test cases follow, each consists of a single line conta…

【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…

10万字208道Java经典面试题总结(2024修订版)- SpringBoot篇下篇

目录 1、Spring Boot的配置文件有哪几种格式&#xff0c;它们之间有何区别&#xff1f;2、Spring Boot如何实现跨域资源共享&#xff08;CORS&#xff09;&#xff1f;3、Spring Boot中的配置文件如何进行加密&#xff1f;4、Spring Boot如何集成Spring Data JPA&#xff1f;5、…

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

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

解决前后端发版本时候,手动清除浏览器缓存

在.html页面中添加标签 后端配置nginx,让index.html不缓存 location /index.html { add_header Cache-Control “no-cache, no-store”; }在vite.config.ts中添加 rollupOpyions: { output: { // 输出编译后的文件名称&#xff1a;【文件名称.时间戳】、【文件名称.版本号.…

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

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

基于java实现选择排序和插入排序

选择排序 实现逻辑&#xff1a; 选择排序是将当前元素和剩下的元素进行比较当当前元素大于所比较的元素的时候两个元素进行交换 public class Search { // 选择排序private void Serach() {};public static <E extends Comparable <E> > void search(E[] arr…

Spring Boot教程之三:Spring Boot 与 Spring MVC 及 Spring的区别

Spring Boot 与 Spring MVC 的区别 Spring MVC&#xff1a; Spring 被广泛用于创建可扩展的应用程序。对于 Web 应用程序&#xff0c;Spring 提供了 Spring MVC 框架&#xff0c;它是 Spring 的一个广泛使用的模块&#xff0c;用于创建可扩展的 Web 应用程序。Spring MVC 框架支…