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直接回收,这也就意味着只要是存储在栈空间上的变量都无法做到两数交换。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 购物弹窗组件 (微信小程序)

效果图&#xff0c;暂时只适应单规格&#xff0c;居中弹出和下方弹出&#xff0c;如需求不满足&#xff0c;请自行修改代码 &#xff08;更新于24/11/15) 居中显示效果 下方弹出效果 html <template><view class"" v-if"show":class"mod…

革新车间照明,分布式IO模块引领智能制造新纪元

在智能制造的浪潮中&#xff0c;每一个细节的优化都是推动生产效率与能耗管理迈向新高度的关键。车间照明系统&#xff0c;作为生产环境中不可或缺的一环&#xff0c;其智能化升级正成为众多企业转型升级的重要着力点。 一、从传统到智能&#xff1a;照明系统的变革之旅 传统…

Java基于微信小程序+SSM的校园失物招领小程序

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

微软Office 2021 24年11月授权版

概述 Microsoft Office LTSC 2021 专业增强版是微软公司推出的一款专为企业客户设计的办公软件套件。该版本于2024年11月进行了批量许可版更新推送&#xff0c;旨在为企业用户提供更加稳定、高效的办公体验。 主要特点 LOGO设计趋势强化&#xff1a;新版Office将棱角改为圆角…

uniapp实现中英文切换

home.js const data {ZH: {content1: "苹果",},EN: {content1: “Apple”,} } export default dataindex.js import home from "./home.js" export default {home }en.js import part1 from ./data/part1/index.js const en {language: {name: "…

go-zero(七) RPC服务和ETCD

go-zero 实现 RPC 服务 在实际的开发中&#xff0c;我们是通过RPC来传递数据的&#xff0c;下面我将通过一个简单的示例&#xff0c;说明如何使用go-zero框架和 Protocol Buffers 定义 RPC 服务。 一、生成 RPC项目 在这个教程中&#xff0c;我们根据user.api文件&#xff0…

C#.Net筑基-字符串超全总结

字符串是日常编码中最常用的引用类型了&#xff0c;可能没有之一&#xff0c;加上字符串的不可变性、驻留性&#xff0c;很容易产生性能问题&#xff0c;因此必须全面了解一下。 01、字符与字符编码 1.1、字符Char 字符 char 表示为 Unicode字符&#xff0c;在C#中用 UTF-16 …

ROS Action

在 ROS 中&#xff0c;Action 是一种支持长时间异步任务的通信机制。与 Service 不同&#xff0c;Action 允许客户端发起一个请求&#xff0c;并在任务执行的过程中不断接收反馈&#xff0c;直到任务完成。这种机制非常适用于可能需要较长时间来完成的任务&#xff0c;比如机器…

23.UE5删除存档

2-25 删除存档制作_哔哩哔哩_bilibili 按照自己的风格制作删除按钮 这样该行的存档就被从存档列表中删除了&#xff0c;并且实际存档&#xff08;我的存档蓝图&#xff09;中也被删除了 但是存在一个问题&#xff0c;如果存档数据中存在索引为: 0 1 2 3的存档&#xff0c;当索…

LoFTR: Detector-Free Local Feature Matching with Transformers—特征点匹配算法系列

LoFTR: Detector-Free Local Feature Matching with Transformers 受到&#xff1a;受到开创性作品 SuperGlue 的启发 摘要总结&#xff1a; 提出了一种局部图像特征匹配的新方法。更为突出说明的是室内场景下的特征点的匹配问题。 不是依次执行图像特征检测、描述和匹配&#…

图像基础算法学习笔记

目录 概要 一、图像采集 二、图像标注 四、图像几何变换 五、图像边缘检测 Sobel算子 Scharrt算子 Laplacian算子 Canny边缘检测 六、形态学转换 概要 参考书籍&#xff1a;《机器视觉与人工智能应用开发技术》 廖建尚&#xff0c;钟君柳 出版时间&#xff1a;2024-…

排序算法 -归并排序

文章目录 1. 归并排序&#xff08;Merge Sort&#xff09;1.1 简介1.2 归并排序的步骤1.3 归并排序c 语言实现代码说明 1.4 时间复杂度1.5 空间复杂度1.6 动画 1. 归并排序&#xff08;Merge Sort&#xff09; 1.1 简介 归并排序&#xff08;Merge Sort&#xff09;是一种基于…

wireshark 基础

wireshark 基础 一、wireshark介绍 Wireshark&#xff08;前称Ethereal&#xff09;是一个网络封包分析软件。网络封包分析软件的功能是捕获网络封包&#xff0c;并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口&#xff0c;直接与网卡进行数据报文交换…

GIT 入门详解指南

前言&#xff1a; 注&#xff1a;本博客仅用于记录本人学习过程中对git的理解&#xff0c;仅供学习参考&#xff0c;如有异议请自行查资料求证 安装 使用git之前必须完成git的安装&#xff0c;Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行 git 安装教程 基本…

从 IDC 到云原生:稳定性提升 100%,成本下降 50%,热联集团的数字化转型与未来展望

作者&#xff1a;金峰&#xff08;项良&#xff09;、朱永林、赵世振&#xff08;寰奕&#xff09; 公司简介 杭州热联集团股份有限公司成立于 1997 年 10 月&#xff0c;是隶属杭州市实业投资集团的国有控股公司。公司专业从事国际、国内钢铁贸易黑色大宗商品及产业服务&…

【微软:多模态基础模型】(4)统一视觉模型

欢迎关注[【youcans的AGI学习笔记】](https://blog.csdn.net/youcans/category_12244543.html&#xff09;原创作品 【微软&#xff1a;多模态基础模型】&#xff08;1&#xff09;从专家到通用助手 【微软&#xff1a;多模态基础模型】&#xff08;2&#xff09;视觉理解 【微…

机器学习——期末复习 重点题归纳

第一题 问题描述 现有如下数据样本&#xff1a; 编号色泽敲声甜度好瓜1乌黑浊响高是2浅白沉闷低否3青绿清脆中是4浅白浊响低否 &#xff08;1&#xff09;根据上表&#xff0c;给出属于对应假设空间的3个不同假设。若某种算法的归纳偏好为“适应情形尽可能少”&#xff0c;…

Web3浪潮下的区块链应用:从理论到实践的全面解析

随着Web3的兴起&#xff0c;区块链技术作为其核心支撑&#xff0c;正迎来前所未有的应用爆发。Web3不仅仅是技术的革新&#xff0c;更代表了一种去中心化、开放、透明的互联网愿景。在这一背景下&#xff0c;区块链技术的应用正从理论走向实践&#xff0c;推动着各行各业的数字…

学习大数据DAY61 宽表加工

目录 模型设计 加工宽表 任务调度&#xff1a; 大表 - 把很多数据整合起来 方便后续的明细查询和指标计算 模型设计 设计 建模 设计: excel 文档去编写 建模: 使用建模工具 PowerDesigner Navicat 在线画图工具... 把表结构给绘 制出来 共享\项目课工具\pd 加工宽表 数…

ChromeDriver驱动下载地址更新(保持最新最全)

说明&#xff1a; ChromeDriver 是 Selenium WebDriver 用于控制 Chrome 的独立可执行文件。 为了方便下载使用&#xff0c;本文保持ChromeDriver的最新版本更新&#xff0c;并提供115.0.5763.0-133.0.6841.0版本的下载地址&#xff1a; 所有版本和下载地址&#xff1a; &am…