java不使用第三变量交换两个变量的值

 更新时间:2024年04月25日 09:16:02   作者:天航星  
这篇文章主要介绍了java不使用第三变量交换两个变量的值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

不使用第三变量交换两个变量的值

在 Java 中,经常会需要交换两个变量的值,我们一般是使用第三变量完成

比如:

temp = a;
a = b;
b = temp;

这样的写法确实能达成目标,但因此而引入了第三变量,对资源的消耗增加了。

这里总结了两种不使用第三变量实现的方式

这两种方法仅为个人总结,不能断定只有这三种,非常希望大家能提出其他的方式,互相学习。

加减交换法

a = a + b;
b = a - b;
a = a - b;a = a + b;
b = a - b;
a = a - b;

这种方式还有更高级的写法:

a = a + b - (b = a);

这种写法确实达到了目标,但还只是数字层面的技巧,下面介绍一种计算机底层的方式。

异或运算法

异或运算平时用得较少,这里先介绍一下。

两个数进行异或运算,其实就是它们的二进制数每一位进行运算:相同为 0,不同为 1

0 ^ 0 = 0;1 ^ 0 = 1;0 ^ 1 = 1;1 ^ 1 = 0;

由此可以得出异或的 3 个特点:

  • 0 异或任何数 = 任何数
  • 1异或任何数 = 任何数取反
  • 任何数异或自己 = 把自己置0

异或的常见用途:

  • 使某些特定的位翻转

例如对数 10100001 的第 2 位和第 3 位翻转,则可以将该数与 00000110 进行异或运算:

10100001 ^ 00000110 = 10100111
  • 两个变量值的交换,而不必使用第三变量

这就是我们这里的需求了。

例如交换两个整数 a = 10100001,b = 00000110 的值, 可以这样实现:

a = a ^ b; // a = 10100111
b = b ^ a; // b = 10100001
a = a ^ b; // a = 00000110

以上过程等效于:

a = a ^ b;
b = b ^ a = b ^ ( a ^ b ) = a ^ b ^ b = a ^ 0 = a;
a = a ^ b = (a ^ b) ^ a = b ^ a ^ a = b ^ 0 = b;

这样就实现了两个变量值的交换。

更推荐这种方式,倒不因为这样写更高级,而是这样的二进制运算是最快的,执行效率最高。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java实现经典拳皇误闯冒险岛游戏的示例代码

    Java实现经典拳皇误闯冒险岛游戏的示例代码

    《拳皇误闯冒险岛》是拳皇和冒险岛素材的基于JavaSwing的动作类游戏。本文将用Java语言实现这一游戏,需要的小伙伴可以参考一下
    2022-02-02
  • 关于Java变量的声明、内存分配及初始化详解

    关于Java变量的声明、内存分配及初始化详解

    下面小编就为大家带来一篇关于Java变量的声明、内存分配及初始化详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 关于@Component注解的含义说明

    关于@Component注解的含义说明

    这篇文章主要介绍了关于@Component注解的含义说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • SpringBoot 过滤器 Filter使用实例详解

    SpringBoot 过滤器 Filter使用实例详解

    这篇文章主要为大家介绍了SpringBoot 过滤器Filter使用实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 利用Jasypt如何对Spring Boot配置文件加密

    利用Jasypt如何对Spring Boot配置文件加密

    这篇文章主要给大家介绍了关于利用Jasypt如何对Spring Boot配置文件加密的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • Spring Boot 对接深度求索接口实现知识问答功能

    Spring Boot 对接深度求索接口实现知识问答功能

    本文详细介绍了如何使用 Spring Boot 对接深度求索接口,实现知识问答功能,通过整合深度求索 API,我们可以轻松地在 Spring Boot 项目中实现智能问答功能,
    2025-02-02
  • 解决@Validated对List对象验证失效问题

    解决@Validated对List对象验证失效问题

    文章指出@Validated注解无法验证List数组参数,建议手动逐项验证或封装List为对象进行验证,前者代码冗余但直接,后者需调整JSON结构但更简洁,根据需求选择方案,权衡灵活性与参数改造成本
    2025-09-09
  • Java开发中常用记录

    Java开发中常用记录

    这篇文章主要介绍了Java-编程式事务、Java-Stream、Linux常用命令,需要的朋友可以参考下
    2023-05-05
  • Tomcat 实现WebSocket详细介绍

    Tomcat 实现WebSocket详细介绍

    这篇文章主要介绍了Tomcat 如何实现WebSocket的相关资料,对WebSocket协议通信的过程进行了详细介绍,需要的朋友可以参考下
    2016-12-12
  • Java 中HttpURLConnection附件上传的实例详解

    Java 中HttpURLConnection附件上传的实例详解

    这篇文章主要介绍了Java 中HttpURLConnection附件上传的实例详解的相关资料,希望通过本文大家能掌握这样的知识内容,需要的朋友可以参考下
    2017-09-09

最新评论