【java面试题】不定义新变量的情况下交换两个Integer变量

news2024/11/27 12:42:01

题目:
不定义新变量的情况下交换两个Integer变量,完善swap()方法:


public class Main {
    public static void main(String[] args) {
        Integer a = 10;
        Integer b = 20;
        swap(a, b);
        System.out.printf("a is %d,b is %d", a, b);
    }

    public static void swap(Integer a, Integer b) {
       //完善代码
    }

}

首先完善swap先,这题目还有关于java到底是引用传递还是值传递的问题。

解题思路:
没有引入新变量的话,只能在a、b之间互相计算,将两个变量值信息混合在一起赋值给其中一个变量如a保存,再用另外一个变量b将混合变量a分离出a值赋值给b,那么现在b变量就是原来a的值,再用现在b变量(即原来的a的值)去将混合变量分离出b原来的值赋值给a。这样就可以实现没有新变量值就可以交换值。而其中的混合算法和分离算法很重要,要保证求值的唯一性(即y=fun(x),一个x值只能有一个y值对应)。下面给出三种算法:
1、异或算法


public class Main {
    public static void main(String[] args) {
        Integer a = 10;
        Integer b = 20;

        swap(a, b);

        System.out.printf("a is %d,b is %d", a, b);
    }

    public static void swap(Integer a, Integer b) {
        a = a ^ b;//混合算法
        b = a ^ b;//分离算法
        a = a ^ b;//分离算法
        System.out.printf(" a is %d,b is %d \n", a, b);
    }
}

运行结果:

 a is 20,b is 10 
a is 10,b is 20

为什么异或算法可以?因为它满足唯一性,例如 1 和 0的异或是1 ,1和1的异或是0,
反推的话,知道了异或结果是1,而一个值为1,那么另外一个参与异或的必定是0。

具体举个例子:

a = 10101
b = 10011

a^b = 00110

a = 10101
b = 10011
----------
    00110   

将异或结果与a异或可以求出b,得出的结果是 10101,等于b的值

a^b = 00110
a   = 10011
----------
      10101

也就是可以得出一个结论:
c=a^b, 那么 a= c^b,b=c^a;

2、加减法

代码:


public class Main {
    public static void main(String[] args) {
        Integer a = 10;
        Integer b = 20;
        swap(a, b);
        System.out.printf("a is %d,b is %d", a, b);
    }
    public static void swap(Integer a, Integer b) {
        a = a + b;
        b = a - b;
        a = a - b;
        System.out.printf(" a is %d,b is %d \n", a, b);
    }
}

运行结果:

 a is 20,b is 10 
a is 10,b is 20

加减法的原理很好理解,c= a+b, a= c-b,b= c-a。

3、乘除法
代码:


public class Main {
    public static void main(String[] args) {
        Integer a = 10;
        Integer b = 20;
        swap(a, b);
        System.out.printf("a is %d,b is %d", a, b);
    }
    public static void swap(Integer a, Integer b) {
        a = a * b;
        b = a / b;
        a = a / b;
        System.out.printf(" a is %d,b is %d \n", a, b);
    }
}

运行结果:

 a is 20,b is 10 
a is 10,b is 20

乘除法的原理也很简单:c= a*b , a= c / b ,b= c / a;

4、讨论
4.1 与算法行不行?

举个例子: 1 与 0 结果是0,反过来,知道了与的结果是0,一个值为1,那么可以推出,另外一个值必定是0。但是要是一下面这种情况就失效了,知道了与的结果是0,一个值为0,那么推出另外一个值可能为0,也可能1,这种模棱两可的结果不满足推导结果的唯一性,所以就不能用在这道题中。

4.2 关于Java是值传递还是引用传递的问题讨论

某面试官(liwen zaozhi)说Java是引用传递。说main方法中的 System.out.printf("a is %d,b is %d", a, b);可以输出交换后的结果。他说对了一半。上面的变量是包装类:Integer ,传的值是a对象对应的引用句柄值,按理在swap方法处理之后可以在main方法中获取值。为什么输出结果没有呢?
分析一下过程:
在这里插入图片描述
那传递的是引用的句柄值,那么应该可以修改引用句柄对应的对象的值。现实上没有发生这样的事,为何?原因出在Integer 包装类中的 private final int value;,不可变对象。
用反编译工具看看字节码之后的对代码:

public class Main {
  public static void main(String[] args) {
    Integer a = Integer.valueOf(10);
    Integer b = Integer.valueOf(20);
    swap(a, b);
    System.out.printf("a is %d,b is %d", new Object[] { a, b });
  }
  
  public static void swap(Integer a, Integer b) {
    a = Integer.valueOf(a.intValue() ^ b.intValue());
    b = Integer.valueOf(a.intValue() ^ b.intValue());
    a = Integer.valueOf(a.intValue() ^ b.intValue());
    System.out.printf(" a is %d,b is %d \n", new Object[] { a, b });
  }
}

编译语法糖的机制,自动拆箱装箱。swap方法中 a = Integer.valueOf(a.intValue() ^ b.intValue());,结果就是swap方法栈中的局部变量值a的值指向了新的引用句柄。而main方法中a的值还是原来的应用句柄,不影响它的值。所以为什么main中的打印输出显示不了交换后的情况。

给出个结论:Java只有值传递,没有引用传递。

值传递:是在调用函数时将实际参数复制一份到函数中,这样如果对参数进行修改,将不会影响到实际的参数。

引用传递:是指在调用函数时将实际参数地址直接传递到函数中,那么如果函数中对参数进行修改,将影响到实际的参数。

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

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

相关文章

TansUNet代码理解

首先通过论文中所给的图片了解网络的整体架构: vit_seg_modeling部分 模块引入和定义相关量: # codingutf-8 # __future__ 在老版本的Python代码中兼顾新特性的一种方法 from __future__ import absolute_import from __future__ import division fr…

制造业为什么要建设数字化供应链

数字化让越来越多的人走向了线上的世界,让那些拥有线上产品或提供线上服务的企业提供了更多流量。 但与此同时,传统制造业遭受了沉重的打击,考虑到防疫要求,很多工厂长期处于人手不足的状态,生产制造效率大幅降低&…

激活函数总结(六):ReLU系列激活函数补充(RReLU、CELU、ReLU6)

激活函数总结(六):ReLU系列激活函数补充 1 引言2 激活函数2.1 RReLU激活函数2.2 CELU激活函数2.3 ReLU6 激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函数 (Sigmoid、Tanh、ReLU、Leaky ReLU、PReLU、Swish、ELU、SEL…

用python写一个简单的贪吃蛇游戏

入门教程、案例源码、学习资料、读者群 请访问: python666.cn 大家好,欢迎来到 Crossin的编程教室 ! 不知道有多少同学跟我一样,最初接触编程的动机就是为了自己做个游戏玩? Python 虽然并不是一个“为游戏而生”的语言…

给QT添加图片

给QT添加图片 第一步: 添加图片资源文件。

基于深度学习的3D城市模型增强【Mask R-CNN】

在这篇文章中,我们描述了一个为阿姆斯特丹 3D 城市模型自动添加门窗的系统(可以在这里访问)。 计算机视觉用于从城市全景图像中提取有关门窗位置的信息。 由于这种类型的街道级图像广泛可用,因此该方法可用于较大的地理区域。 推荐…

LinearAlgebraMIT_9_LinearIndependence/SpanningASpace/Basis/Dimension

这节课我们主要学习一下(Linear Independence)线性无关,(spanning a space)生成空间,(basis)基和(dimension)维度。同时我们要注意这四个很重要的基本概念的描述对象,我们会说向量组线性无关,由一个向量组生成的空间,子…

哪些CRM的报价公开且透明?

企业在选型时,会发现很多品牌的CRM系统价格并不透明,往往都是需要跟产品顾问沟通后才能了解。下面推荐一款价格实在的CRM系统,所有报价公开透明,那就是Zoho CRM。 Zoho CRM是什么? Zoho CRM是一款在线CRM软件&#x…

将十进制(整数型)转换为二进制(字符串型)numpy.binary_repr()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将十进制(整数型)转换为 二进制(字符串型) numpy.binary_repr() [太阳]选择题 下列代码最后一次输出的结果是? import numpy as np…

从键盘输入一些字符,并逐个把它们送到磁盘上去,直到用户输入一个“#”为止

题为c程序设计(第五版)谭浩强 例10.1 目录 文章目录 前言 一、题目复现 二、实现步骤 1.思路分析 2.具体实现 总结 前言 这篇博客,让我们一起学习顺序读写数据文件。 什么是顺序读写呢?顺序读写就是对文件读写数据的顺序和数据在…

云端的“人机之恋”,离我们还有多远?

不同于人与人之间复杂而多变的关系,AI与人的关系往往简单却又微妙。 在往来的语句对话中,AI通常通过文本语言的训练与学习去面对被抛出的问题。延伸至技术领域,主流的Transformer架构也仅仅是通过数据对物理世界的压缩来实现自我智能的涌现&a…

101. 对称二叉树

题目 原题链接 : 101.对称二叉树 题面 : 对于这一题呢,题目要求给出递归和迭代两种方式来解决!!! 注 : 这一题不仅仅是判断左右两个子节点是否对称,而是要遍历两棵树而且要比较内侧和外侧节点 递归 先确认递归三要素 : 确定递归函数的参数和返回值 bool …

gitee(码云)如何生成并添加公钥配置用户信息

一,简介 在使用Gitee的时候,公钥是必须的,无论是克隆还是上传。本文主要介绍如何本地生成和添加公钥到服务器,然后配置自己的用户信息,方便日后拉取与上传代码。 二,步骤介绍 2.1 本地生成公钥 打开git ba…

Linux上安装温度监控软件

文章目录 Linux上安装温度监控软件IDRAC设置 Linux上安装温度监控软件 服务器的温度是影响服务器性能重要条件,怎么监控机器的温度呢,这里知道的有两种方式 通过管理界面,查看机器的温度通过机器上安装监监控软件来监控温度 在物理机上怎么…

Go把Map转成对象

最近使用了Redis的Hash,把一个对象给存储到了hash里面,具体如下: 现在需要从RedisHash缓存里面把结果给取出来,同时赋值到一个对象上面 result, err : global.GVA_REDIS.HGetAll(context.Background(), key).Result() 问题是resul…

接触式静电压测试仪的使用场景和注意事项

接触式静电压测试仪是一种用于测量物体表面静电电势的工具。它使用金属接触针或传感器接触待测试物体表面,通过测量传感器和地面之间的电势差来确定物体表面的静电电势。 接触式静电压测试仪通常用于以下场景: 1. 静电防护:在静电敏感环境中…

腾讯云轻量和CVM有什么区别?不都是服务器吗?

腾讯云轻量服务器和云服务器有什么区别?为什么轻量应用服务器价格便宜?是因为轻量服务器CPU内存性能比云服务器CVM性能差吗?轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境,云服务器CV…

机器学习深度学习——从编码器-解码器架构到seq2seq(机器翻译)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——注意力提示、注意力池化(核回归) 📚订阅专栏:机器学习&a…

UDP服务器—实现数据通信

目录 前言 1.接口介绍 2.编写服务器 3.编写客户端 4.测试 总结 前言 在这篇文章中为大家介绍如何通过编码实现数据通信,实现思路是根据前面介绍的网络编程函数编写一个服务端和客户端,实现客户端和服务端双方通信 1.接口介绍 创建套接字 #include…

前端:Vue.js学习

前端:Vue.js学习 1. 第一个Vue程序2. Vue指令2.1 v-if、v-else-if、v-else2.2 v-for2.3 事件绑定 v-on:2.4 v-model 数据双向绑定2.5 v-bind 绑定属性 3. Vue组件4. Vue axios异步通信5. 计算属性6. 插槽 slots7. 自定义事件内容分发 1. 第一个Vue程序 首先把vue.js拷贝到本地…