您好,登錄后才能下訂單哦!
本篇內容主要講解“有哪些實現兩個數互換的方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“有哪些實現兩個數互換的方法”吧!
基本數據類型
借助第三個變量
package 貪心;/* 作者 :XiangLin 創建時間 :2020/9/15 22:48 文件 :XX.java IDE :IntelliJ IDEA */ import java.util.Random; public class Exchange1 { public static void main(String[] args) { /** * 隨機生成兩個固定序列的0-100之間的整數, * 其中101表示生成的數范圍區間在:[0-101) */ Random random = new Random(47); int a = random.nextInt(101); int b = random.nextInt(101); System.out.println("交換前:a = " + a + ", b = " + b); /** * 借助第三個變量實現第三個數互換 */ int t = a; // t == a a = b; // a == b b = t; // b == t == a System.out.println("交換后:a = " + a + ", b = " + b); } }
控制臺輸出如下:
如果有不明白的朋友,可以自己準備三個杯子,一個空杯代表變量t,兩個杯子裝上水分別代表變量a、b,然后互換一下a、b兩個杯子里的水即可明白。
不借助第三個變量
package 貪心;/* 作者 :XiangLin 創建時間 :2020/9/15 22:51 文件 :cccc.java IDE :IntelliJ IDEA */ import java.util.Random; public class Exchange2 { public static void main(String[] args) { /** * 隨機生成兩個固定序列的0-100之間的整數, * 其中101表示生成的數范圍區間在:[0-101) */ Random random = new Random(48); int a = random.nextInt(101); int b = random.nextInt(101); System.out.println("交換前:a = " + a + ", b = " + b); a = a + b; // a == a + b b = a - b; // b == a + b - b == a, 此時b == a a = a - b; // a == a + b - a == b, 此時a == b System.out.println("交換后:a = " + a + ", b = " + b); } }
控制臺輸出如下:
通過乘除操作實現兩個數互換
package 貪心;/* 作者 :XiangLin 創建時間 :2020/9/15 22:54 文件 :xxx.java IDE :IntelliJ IDEA */ import java.util.Random; public class Exchange3 { public static void main(String[] args) { /** * 隨機生成兩個固定序列的0-100之間的整數, * 其中101表示生成的數范圍區間在:[0-101) */ Random random = new Random(50); int a = random.nextInt(101); int b = random.nextInt(101); System.out.println("交換前:a = " + a + ", b = " + b); a = a * b; // 此時a == a * b b = a / b; // b == a * b / b == a, 此時b == a a = a / b; // a == a * b / a == b, 此時a == b System.out.println("交換后:a = " + a + ", b = " + b); } }
Output:
利用賦值運算符
因為這兩種方法是筆者后面補充的,所以第七種和第八種方法放在前面
利用賦值和加減來實現兩個數互換
package 貪心;/* 作者 :XiangLin 創建時間 :2020/9/15 22:58 文件 :xx.java IDE :IntelliJ IDEA */ public class Exchange7 { public static void main(String[] args) { /** * 隨機生成兩個0-100之間的整數, * 其中Math.random()會生成[0-1)之間任意的double類型的數 * 因此101表示生成的數范圍區間在:[0-101) */ int a = (int) (Math.random() * 101); int b = (int) (Math.random() * 101); System.out.println("交換前: a = " + a + ", b = " + b); a = b + a - (b = a); // a == b + a - a == b, a == b System.out.println("交換后: a = " + a + ", b = " + b); } }
控制臺輸出如下:
利用賦值和加乘來實現兩個數互換
package 貪心;/* 作者 :XiangLin 創建時間 :2020/9/15 23:00 文件 :xxx.java IDE :IntelliJ IDEA */ public class Exchange8 { public static void main(String[] args) { /** * 隨機生成兩個0-100之間的整數, * 其中Math.random()會生成[0-1)之間任意的double類型的數 * 因此101表示生成的數范圍區間在:[0-101) */ int a = (int) (Math.random() * 101); int b = (int) (Math.random() * 101); System.out.println("交換前: a = " + a + ", b = " + b); a = b + (b = a) * 0; // a == b + a * 0 == b, a == b System.out.println("交換后: a = " + a + ", b = " + b); } }
控制臺輸出如下:
異或
在介紹第四種方法之前,首先要跟大家介紹一下Java中的"異或"操作符(^)。
異或操作符是Java中按位操作符的一種,那么什么是按位操作符呢?
按位操作符用來操作整數基本數據類型中的單個"比特"(bit),即二進制位。我們都知道,計算機中是采用二進制計數,而不是十進制計數。也就是說,計算機中沒有我們所謂的2、3、4、5 … 100 … 1000 … ,計算機中有的只是0和1,逢二便進一。而按位操作符會對兩個參數中對應的位,也就是對用二進制表示的兩個參數相對應的0或1,執行布爾代數運算,并最終生成一個結果。
當然在Java中我們一般運用按位操作符很少,而我們最開始接觸按位操作符,很可能是從C語言或者數字邏輯與電路。事實上,按位操作符來源于C語言面向底層的操作,這種操作經常需要直接操縱硬件,設置硬件寄存器內的二進制位。而Java的設計初衷是嵌入電視機機頂盒內,所以這種面向底層的操作被保留了下來。Java技術的三大版本之一:JavaME,Java平臺微型版正是用作嵌入式開發,用來開發數字機頂盒、可視電話等電子設備。
了解了按位操作符的概念,那么接下來,我們來了解"異或"操作
如a ^ b,若a、b兩個值不同,則異或結果為1;若a、b兩個數相同,則異或結果為0。
大家如果要記憶的話,可以記住六字真言:同為0,異為1。
或者明白或運算的朋友也可以通過字面意思來理解,若兩數相異(要么是0和1,要么是1和0),則執行或運算;若兩數相同(同為0,或同為1),則結果為0。
如果還是有點抽象的話,沒得事,直接上代碼:
package 貪心;/* 作者 :XiangLin 創建時間 :2020/9/15 23:05 文件 :xxx.java IDE :IntelliJ IDEA */ public class Test { public static void main(String[] args) { /** * 分別把結果以二進制的形式輸出 */ System.out.println("3的二進制:" + Integer.toBinaryString(3)); System.out.println("4的二進制:" + Integer.toBinaryString(4)); System.out.println("3 ^ 3 的二進制:" + Integer.toBinaryString(3 ^ 3)); System.out.print("3 ^ 0 的二進制:" + Integer.toBinaryString(3 ^ 0)); if (3 == (3 ^ 0)) System.out.println(",也就是十進制的3"); System.out.print("4 ^ 3 ^ 3 的二進制:" + Integer.toBinaryString(4 ^ 3 ^ 3)); if (4 == (4 ^ 3 ^ 3)) System.out.println(",也就是十進制的4"); } }
Output:
好戲開場,通過異或操作實現兩個數互換
package 貪心;/* 作者 :XiangLin 創建時間 :2020/9/15 23:08 文件 :xx.java IDE :IntelliJ IDEA */ import java.util.Random; public class Exchange4 { public static void main(String[] args) { /** * 隨機生成兩個固定序列的0-100之間的整數, * 其中101表示生成的數范圍區間在:[0-101) */ Random random = new Random(51); int a = random.nextInt(101); int b = random.nextInt(101); System.out.println("交換前:a = " + a + ", b = " + b); a = a ^ b; // 此時, a == a ^ b b = a ^ b; // b == a ^ b ^ b == a, 此時b == a a = a ^ b; // a == a ^ b ^ a == b, 此時a == b System.out.println("交換后:a = " + a + ", b = " + b); } }
Output:
引用數據類型
想必大家已經學了四種方法,已經對兩個數互換信心滿滿,那么接下來,我們來看一道面試題:
package 貪心;/* 作者 :XiangLin 創建時間 :2020/9/15 23:10 文件 :xx.java IDE :IntelliJ IDEA */ public class Exchange5 { public static void main(String[] args) { Integer a = 10; Integer b = 20; swop(a, b); // 打印結果:a = 20, b = 10 System.out.println("a = " + a + ", b = " + b); } private static void swop(Integer a, Integer b) { // 完成此處代碼 } }
如代碼所示,完成指定位置的代碼,使得程序最后的運行結果為:a = 20, b = 10
你可能覺得這還不簡單,然后"刷刷刷"完成可能如以下的代碼:
private static void swop(Integer a, Integer b) { a = a ^ b; b = a ^ b; a = a ^ b; }
然后再看輸出結果就傻眼了:
納尼,不變?這是為什么?想知道為什么的可能需要自行了解一下Java內存模型了,畢竟Java里面沒有C語言的指針(小聲bb)。當然,本博主以后可能也會出這方面的博客。
下面讓我來揭曉正確答案吧!
private static void swop(Integer a, Integer b) throws NoSuchFieldException, IllegalAccessException { // 完成此處代碼 // a = a ^ b; // b = a ^ b; // a = a ^ b; int x = a; int y = b; // 運用反射來操作Integer Class c = Integer.class; Field field = c.getDeclaredField("value"); // 授權訪問私有 field.setAccessible(true); // 將 a、b的值分別設置為y、x的值 field.setInt(a, y); field.setInt(b, x); }
當當當當,控制臺輸出如下:
至于如果有朋友想了解反射的知識,可以關注我的博客哦!畢竟反射是我當年學習JavaSE知識覺得最神奇也最喜歡的三個知識之一。
至于第六種方法嘛:
private static void swop(Integer a, Integer b) { System.out.println("a = " + b + ", b = " + a); // 終止Java虛擬機的運作 System.exit(0); }
到此,相信大家對“有哪些實現兩個數互換的方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。