溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

有哪些實現(xiàn)兩個數(shù)互換的方法

發(fā)布時間:2021-10-28 10:06:14 來源:億速云 閱讀:143 作者:iii 欄目:web開發(fā)

本篇內(nèi)容主要講解“有哪些實現(xiàn)兩個數(shù)互換的方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“有哪些實現(xiàn)兩個數(shù)互換的方法”吧!

基本數(shù)據(jù)類型

借助第三個變量

package 貪心;/* 作者     :XiangLin 創(chuàng)建時間 :2020/9/15 22:48 文件     :XX.java IDE      :IntelliJ IDEA */  import java.util.Random;  public class Exchange1 {     public static void main(String[] args) {         /**          * 隨機(jī)生成兩個固定序列的0-100之間的整數(shù),          * 其中101表示生成的數(shù)范圍區(qū)間在:[0-101)          */         Random random = new Random(47);         int a = random.nextInt(101);         int b = random.nextInt(101);         System.out.println("交換前:a = " + a + ", b = " + b);          /**          * 借助第三個變量實現(xiàn)第三個數(shù)互換          */         int t = a; // t == a         a = b;     // a == b         b = t;     // b == t == a         System.out.println("交換后:a = " + a + ", b = " + b);     } }

控制臺輸出如下:

有哪些實現(xiàn)兩個數(shù)互換的方法

如果有不明白的朋友,可以自己準(zhǔn)備三個杯子,一個空杯代表變量t,兩個杯子裝上水分別代表變量a、b,然后互換一下a、b兩個杯子里的水即可明白。

不借助第三個變量

package 貪心;/* 作者     :XiangLin 創(chuàng)建時間 :2020/9/15 22:51 文件     :cccc.java IDE      :IntelliJ IDEA */  import java.util.Random;  public class Exchange2 {     public static void main(String[] args) {         /**          * 隨機(jī)生成兩個固定序列的0-100之間的整數(shù),          * 其中101表示生成的數(shù)范圍區(qū)間在:[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);     } }

控制臺輸出如下:

有哪些實現(xiàn)兩個數(shù)互換的方法

通過乘除操作實現(xiàn)兩個數(shù)互換

package 貪心;/* 作者     :XiangLin 創(chuàng)建時間 :2020/9/15 22:54 文件     :xxx.java IDE      :IntelliJ IDEA */  import java.util.Random;  public class Exchange3 {     public static void main(String[] args) {         /**          * 隨機(jī)生成兩個固定序列的0-100之間的整數(shù),          * 其中101表示生成的數(shù)范圍區(qū)間在:[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:

有哪些實現(xiàn)兩個數(shù)互換的方法

利用賦值運(yùn)算符

因為這兩種方法是筆者后面補(bǔ)充的,所以第七種和第八種方法放在前面

利用賦值和加減來實現(xiàn)兩個數(shù)互換

package 貪心;/* 作者     :XiangLin 創(chuàng)建時間 :2020/9/15 22:58 文件     :xx.java IDE      :IntelliJ IDEA */  public class Exchange7 {     public static void main(String[] args) {          /**          *  隨機(jī)生成兩個0-100之間的整數(shù),          *  其中Math.random()會生成[0-1)之間任意的double類型的數(shù)          *  因此101表示生成的數(shù)范圍區(qū)間在:[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);     } }

控制臺輸出如下:

有哪些實現(xiàn)兩個數(shù)互換的方法

利用賦值和加乘來實現(xiàn)兩個數(shù)互換

package 貪心;/* 作者     :XiangLin 創(chuàng)建時間 :2020/9/15 23:00 文件     :xxx.java IDE      :IntelliJ IDEA */  public class Exchange8 {     public static void main(String[] args) {          /**          *  隨機(jī)生成兩個0-100之間的整數(shù),          *  其中Math.random()會生成[0-1)之間任意的double類型的數(shù)          *  因此101表示生成的數(shù)范圍區(qū)間在:[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);     } }

控制臺輸出如下:

有哪些實現(xiàn)兩個數(shù)互換的方法

異或

在介紹第四種方法之前,首先要跟大家介紹一下Java中的"異或"操作符(^)。

異或操作符是Java中按位操作符的一種,那么什么是按位操作符呢?

按位操作符用來操作整數(shù)基本數(shù)據(jù)類型中的單個"比特"(bit),即二進(jìn)制位。我們都知道,計算機(jī)中是采用二進(jìn)制計數(shù),而不是十進(jìn)制計數(shù)。也就是說,計算機(jī)中沒有我們所謂的2、3、4、5 … 100 … 1000 … ,計算機(jī)中有的只是0和1,逢二便進(jìn)一。而按位操作符會對兩個參數(shù)中對應(yīng)的位,也就是對用二進(jìn)制表示的兩個參數(shù)相對應(yīng)的0或1,執(zhí)行布爾代數(shù)運(yùn)算,并最終生成一個結(jié)果。

當(dāng)然在Java中我們一般運(yùn)用按位操作符很少,而我們最開始接觸按位操作符,很可能是從C語言或者數(shù)字邏輯與電路。事實上,按位操作符來源于C語言面向底層的操作,這種操作經(jīng)常需要直接操縱硬件,設(shè)置硬件寄存器內(nèi)的二進(jìn)制位。而Java的設(shè)計初衷是嵌入電視機(jī)機(jī)頂盒內(nèi),所以這種面向底層的操作被保留了下來。Java技術(shù)的三大版本之一:JavaME,Java平臺微型版正是用作嵌入式開發(fā),用來開發(fā)數(shù)字機(jī)頂盒、可視電話等電子設(shè)備。

了解了按位操作符的概念,那么接下來,我們來了解"異或"操作

如a ^ b,若a、b兩個值不同,則異或結(jié)果為1;若a、b兩個數(shù)相同,則異或結(jié)果為0。

大家如果要記憶的話,可以記住六字真言:同為0,異為1。

或者明白或運(yùn)算的朋友也可以通過字面意思來理解,若兩數(shù)相異(要么是0和1,要么是1和0),則執(zhí)行或運(yùn)算;若兩數(shù)相同(同為0,或同為1),則結(jié)果為0。

如果還是有點抽象的話,沒得事,直接上代碼:

package 貪心;/* 作者     :XiangLin 創(chuàng)建時間 :2020/9/15 23:05 文件     :xxx.java IDE      :IntelliJ IDEA */  public class Test {     public static void main(String[] args) {         /**          * 分別把結(jié)果以二進(jìn)制的形式輸出          */         System.out.println("3的二進(jìn)制:" + Integer.toBinaryString(3));         System.out.println("4的二進(jìn)制:" + Integer.toBinaryString(4));         System.out.println("3 ^ 3 的二進(jìn)制:" + Integer.toBinaryString(3 ^ 3));          System.out.print("3 ^ 0 的二進(jìn)制:" + Integer.toBinaryString(3 ^ 0));         if (3 == (3 ^ 0))             System.out.println(",也就是十進(jìn)制的3");          System.out.print("4 ^ 3 ^ 3 的二進(jìn)制:" + Integer.toBinaryString(4 ^ 3 ^ 3));         if (4 == (4 ^ 3 ^ 3))             System.out.println(",也就是十進(jìn)制的4");     } }

Output:

有哪些實現(xiàn)兩個數(shù)互換的方法

好戲開場,通過異或操作實現(xiàn)兩個數(shù)互換

package 貪心;/* 作者     :XiangLin 創(chuàng)建時間 :2020/9/15 23:08 文件     :xx.java IDE      :IntelliJ IDEA */  import java.util.Random;  public class Exchange4 {     public static void main(String[] args) {         /**          * 隨機(jī)生成兩個固定序列的0-100之間的整數(shù),          * 其中101表示生成的數(shù)范圍區(qū)間在:[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:

有哪些實現(xiàn)兩個數(shù)互換的方法

引用數(shù)據(jù)類型

想必大家已經(jīng)學(xué)了四種方法,已經(jīng)對兩個數(shù)互換信心滿滿,那么接下來,我們來看一道面試題:

package 貪心;/* 作者     :XiangLin 創(chuàng)建時間 :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);         // 打印結(jié)果:a = 20, b = 10         System.out.println("a = " + a + ", b = " + b);     }      private static void swop(Integer a, Integer b) {         // 完成此處代碼     } }

如代碼所示,完成指定位置的代碼,使得程序最后的運(yùn)行結(jié)果為:a = 20, b = 10

你可能覺得這還不簡單,然后"刷刷刷"完成可能如以下的代碼:

private static void swop(Integer a, Integer b) {         a = a ^ b;         b = a ^ b;         a = a ^ b;     }

然后再看輸出結(jié)果就傻眼了:

有哪些實現(xiàn)兩個數(shù)互換的方法

納尼,不變?這是為什么?想知道為什么的可能需要自行了解一下Java內(nèi)存模型了,畢竟Java里面沒有C語言的指針(小聲bb)。當(dāng)然,本博主以后可能也會出這方面的博客。

下面讓我來揭曉正確答案吧!

 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;          // 運(yùn)用反射來操作Integer         Class c = Integer.class;         Field field = c.getDeclaredField("value");         // 授權(quán)訪問私有         field.setAccessible(true);         // 將 a、b的值分別設(shè)置為y、x的值         field.setInt(a, y);         field.setInt(b, x);       }

當(dāng)當(dāng)當(dāng)當(dāng),控制臺輸出如下:

有哪些實現(xiàn)兩個數(shù)互換的方法

至于如果有朋友想了解反射的知識,可以關(guān)注我的博客哦!畢竟反射是我當(dāng)年學(xué)習(xí)JavaSE知識覺得最神奇也最喜歡的三個知識之一。

至于第六種方法嘛:

private static void swop(Integer a, Integer b) {        System.out.println("a = " + b + ", b = " + a);        // 終止Java虛擬機(jī)的運(yùn)作        System.exit(0);    }

到此,相信大家對“有哪些實現(xiàn)兩個數(shù)互換的方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI