专栏首页BAT的乌托邦【小家java】交换两个变量数值的方法(四种方法)

【小家java】交换两个变量数值的方法(四种方法)

前言

本文主要介绍Java中可以交换两个变量的值的四种方法,可能开发者们在平时的coding中都有遇到过类似的情况,咋一看并不难。但本博文其实就是开开眼界而已,自己玩还行。

若你是一个注重代码设计效率,和优雅编程的人,或者本文能够和你一起探讨,产生共鸣。

四种方式

方式一:采用一个中间变量 优点:最简单最好理解的方式
  public static void main(String[] args) {
        int x = 10, y = 20; //定义两个变量
        System.out.println("交换前 x=" + x + ",y=" + y);
        int temp = x;
        x = y;
        y = temp;
        System.out.println("交换前 x=" + x + ",y=" + y);
    }
方式二:可以用两个数求和然后相减的方式 缺点:如果 x 和 y 的数值过大的话,超出 int 的值会损失精度。
public static void main(String[] args) {
        int x = 10, y = 20; //定义两个变量
        System.out.println("交换前 x=" + x + ",y=" + y);
        x = x + y; //x = 30
        y = x - y; //y = 10
        x = x - y; //x = 20
        System.out.println("交换前 x=" + x + ",y=" + y);
    }
方式三:利用位运算的方式进行数据的交换,思想原理是:一个数异或同一个数两次,结果还是那个数,而且不会超出int范围(最佳实现)
  public static void main(String[] args) {
        int x = 10, y = 20; //定义两个变量
        System.out.println("交换前 x=" + x + ",y=" + y);
        x = x ^ y;  //x = 30
        y = x ^ y;  //y = 10
        x = x ^ y;  //x = 20
        System.out.println("交换前 x=" + x + ",y=" + y);
    }
方式四:利用反射 最为麻烦,切效率低。完全炫技使用
 public static void main(String[] args) {
        int x = 10, y = 20; //定义两个变量
        System.out.println("交换前 x=" + x + ",y=" + y);
        swap(x, y);
        System.out.println("交换前 x=" + x + ",y=" + y);
    }

    private static void swap(Integer a, Integer b) {
        int temp = a;
        try {
            Class clazz = a.getClass();
            Field value = clazz.getDeclaredField("value");
            value.setAccessible(true);
            value.setInt(a, b);

            value.setInt(b, temp);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

所有的运行结果都如下:

交换前 x=10,y=20
交换前 x=10,y=20

但是这里插一句,方式四,通过反射交换时,如果用Java8运行,就是上面的内容。如果用Java10运行如下:

交换前 x=10,y=20
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.sayabc.boot2demo1.service.UserService (file:/D:/work/remotegitcheckoutproject/myprojects/java/boot2-demo1/target/classes/) to field java.lang.Integer.value
WARNING: Please consider reporting this to the maintainers of com.sayabc.boot2demo1.service.UserService
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
交换前 x=10,y=20

很明显多了不少警告信息,因此可见Java9以后是加了很多安全性的东西的。若想了解更多,可以点击上面的 推荐阅读

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【小家java】Java中对时间戳相加减的问题(向前推100天,答案却让我匪夷所思)

    关于时间的计算,会体现在我们程序的方方面面。然后我最近在写一个需求的时候,躺了一个大坑

    BAT的乌托邦
  • 【小家java】final修饰的变量真的不可变吗?

    这可能是大家的一个共识:如果我们希望这个变量不可变,我们可以用final进行修饰。但本篇将带你深入了解不变的含义,我相信可以让你更深的了解final的原理,也能...

    BAT的乌托邦
  • 【小家java】Apache Commons-lang3提供的StopWatch执行时间监视器,以及Spring提供的StopWatch分析

    编码过程中我们经常会希望得到一段代码(一个方法)的执行时间,本文将介绍两种时间监视器(秒表)来让你优雅的、灵活的处理这个问题。

    BAT的乌托邦
  • JDK8这样处理日期,效率绝对提升,逼格必然翻倍!

    开发过程中,经常需要为过生日的用户送上一些祝福,例如,用户的生日为1990-10-12,如果今天是2016-10-12,那么今天就是用户的生日(按公历/身份证日...

    程序员小明
  • 使用RabbitMQ实现接口补偿

    在我们的日常开发中,经常需要调用第三方接口来进行数据传递,在调用接口的过程中,会因为各种原因导致调用的失败。这时我们希望能有一种机制实现对失败的接口的重复调用,...

    oec2003
  • 每日一水之strcmp用法

    strcmp函数 C/C++函数,比较两个字符串 设这两个字符串为str1,str2, 若str1==str2,则返回零; 若str1<str2,则返回负数; ...

    Angel_Kitty
  • Java基础知识串讲之运算符

    在Java中存在着这样一类操作符,是针对二进制进行操作的。它们各自是&、|、^、~、>>、<<、>>>几个位操作符。不管是初始值是依照何种进制,都会换算成二进制...

    南风
  • 谷歌发布分类模型EfficientNet-EdgeTPU,运行速度比ResNet-50快10倍

    谷歌在3月份推出了Coral Dev Board,采用张量处理器(Edge TPU)AI加速器芯片,以及一个USB加密狗,旨在加速现有Raspberry Pi和...

    AiTechYun
  • Postgresql 隐式转换 -- 数据库也来一次 “中保研”

    快要过年了,此篇作为2019年最后一篇的技术文字,年后还有一批正在路上,感谢大家一年多的关注。

    AustinDatabases
  • java工资多少 程序员薪资很高吗

    北京程序员平均工资是12715 元,和此相差无几的是上海、深圳。达内是专业做精英程序员人才招聘的。据调查可知:在工作年限上,3-5年的工程师平均薪酬是20K上下...

    java架构师

扫码关注云+社区

领取腾讯云代金券