【小家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以后是加了很多安全性的东西的。若想了解更多,可以点击上面的 推荐阅读

相关文章
|
1月前
|
算法 Java 开发者
Java 项目实战数字华容道与石头迷阵游戏开发详解及实战方法
本文介绍了使用Java实现数字华容道和石头迷阵游戏的技术方案与应用实例,涵盖GUI界面设计、二维数组操作、游戏逻辑控制及自动解法算法(如A*),适合Java开发者学习游戏开发技巧。
184 46
|
2月前
|
安全 Java API
Java 17 及以上版本核心特性在现代开发实践中的深度应用与高效实践方法 Java 开发实践
本项目以“学生成绩管理系统”为例,深入实践Java 17+核心特性与现代开发技术。采用Spring Boot 3.1、WebFlux、R2DBC等构建响应式应用,结合Record类、模式匹配、Stream优化等新特性提升代码质量。涵盖容器化部署(Docker)、自动化测试、性能优化及安全加固,全面展示Java最新技术在实际项目中的应用,助力开发者掌握现代化Java开发方法。
117 1
|
2月前
|
安全 Java API
Java 集合高级应用与实战技巧之高效运用方法及实战案例解析
本课程深入讲解Java集合的高级应用与实战技巧,涵盖Stream API、并行处理、Optional类、现代化Map操作、不可变集合、异步处理及高级排序等核心内容,结合丰富示例,助你掌握Java集合的高效运用,提升代码质量与开发效率。
191 0
|
2月前
|
算法 搜索推荐 Java
Java中的Collections.shuffle()方法及示例
`Collections.shuffle()` 是 Java 中用于随机打乱列表顺序的方法,基于 Fisher-Yates 算法实现,支持原地修改。可选传入自定义 `Random` 对象以实现结果可重复,适用于抽奖、游戏、随机抽样等场景。
97 0
|
2月前
|
安全 Java
JAVA:Collections类的shuffle()方法
`Collections.shuffle()` 是 Java 中用于随机打乱列表顺序的工具方法,适用于洗牌、抽奖等场景。该方法直接修改原列表,支持自定义随机数生成器以实现可重现的打乱顺序。使用时需注意其原地修改特性及非线程安全性。
95 0
|
2月前
|
算法 安全 Java
java中Collections.shuffle方法的功能说明
`Collections.shuffle()` 是 Java 中用于随机打乱列表顺序的方法,基于 Fisher-Yates 算法实现,常用于洗牌、抽奖等场景。可选 `Random` 参数支持固定种子以实现可重复的随机顺序。方法直接修改原列表,无返回值。
97 0
|
2月前
|
Java 程序员 项目管理
Java 程序员不容错过的 Git Flow 全套学习资料及应用方法详解 Git Flow
本文详细介绍了Git Flow技术方案及其在Java项目中的应用实例,涵盖分支管理、版本发布与紧急修复流程,帮助开发者掌握高效的代码管理方法,提升团队协作效率。附示例操作及代码下载链接。
71 0
|
Java
JAVA方法的定义
JAVA方法的定义
180 0
|
6月前
|
存储 JSON Java
《从头开始学java,一天一个知识点》之:方法定义与参数传递机制
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问"`a==b`和`equals()`的区别",大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 🚀 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。上篇:《输入与输出:Scanner与System类》 | 下篇剧透:《方法重载与可变参数》。
131 25
|
安全 Java 编译器
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
杭州 【Java基础知识 11】java泛型方法的定义和使用(学习+改进+自己理解,想法) (借鉴-侵-删)
108 1