歡迎您光臨本站 註冊首頁

Java Switch對各類型支持實現原理

←手機掃碼閱讀     f2h0b53ohn @ 2020-05-01 , reply:0


Java7開始,switch的參數可以是String類型了,這真的是一個很有用的改進,畢竟string還是挺常用的。到目前為止,switch支持的參數類型有:byte、short、int、char、String、enum。switch對各種類型參數的支持到底是怎麼實現的呢?

byte、short、int

public class Main2 { public static void main(String[] args) { byte b = 1; switch (b) { case 0: System.out.println("0"); break; case 1: System.out.println("1"); break; default: System.out.println("other"); } } }

反編譯:

public class Main2 { public Main2() { } public static void main(String[] args) { byte b = 1; switch(b) { case 0: System.out.println("0"); break; case 1: System.out.println("1"); break; default: System.out.println("other"); } } }

將byte換成short、int,編譯後的結果與上面展示的基本相同。

char



public class Main2 { public static void main(String[] args) { char c = '0'; switch (c) { case '0': System.out.println("0"); break; case '1': System.out.println("1"); break; default: System.out.println("other"); } } }

反編譯:

public class Main2 { public Main2() { } public static void main(String[] args) { char c = 48; switch(c) { case 48: System.out.println("0"); break; case 49: System.out.println("1"); break; default: System.out.println("other"); } } }

從反編譯的結果看,對char類型進行比較的時候,實際比較的是字符對應的ASCⅡ碼,編譯器把switch中char類型的變量轉換成int類型的變量。

String



public class Main2 { public static void main(String[] args) { String s = "0"; switch (s) { case "0": System.out.println("0"); break; case "1": System.out.println("1"); break; default: System.out.println("other"); } } }

反編譯:

public class Main2 { public Main2() { } public static void main(String[] args) { String s = "0"; byte var3 = -1; switch(s.hashCode()) { case 48: if (s.equals("0")) { var3 = 0; } break; case 49: if (s.equals("1")) { var3 = 1; } } switch(var3) { case 0: System.out.println("0"); break; case 1: System.out.println("1"); break; default: System.out.println("other"); } } }

從反編譯的結果看,switch藉助hashCode()和equals()實現了對String的支持――先使用hashCode進行初步判斷,然後使用equal()進行二次校驗(由於哈希衝突的存在,這個二次校驗是必要的)。

public enum ColorEnum { RED, YELLOW, BLUE, GREED }

public class Main { public static void main(String[] args) { ColorEnum color = ColorEnum.YELLOW; switch (color) { case RED: System.out.println("red"); break; case YELLOW: System.out.println("yellow"); break; default: System.out.println("other"); } } }

反編譯:

/* * Decompiled with CFR 0.149. */ package com.learn.java; public final class ColorEnum extends Enum

{ public static final /* enum */ ColorEnum RED = new ColorEnum("RED", 0); public static final /* enum */ ColorEnum YELLOW = new ColorEnum("YELLOW", 1); public static final /* enum */ ColorEnum BLUE = new ColorEnum("BLUE", 2); public static final /* enum */ ColorEnum GREED = new ColorEnum("GREED", 3); private static final /* synthetic */ ColorEnum[] $VALUES; public static ColorEnum[] values() { return (ColorEnum[])$VALUES.clone(); } public static ColorEnum valueOf(String string) { return Enum.valueOf(ColorEnum.class, string); } private ColorEnum(String string, int n) { super(string, n); } static { $VALUES = new ColorEnum[]{RED, YELLOW, BLUE, GREED}; } }

/* * Decompiled with CFR 0.149. */ package com.learn.java; import com.learn.java.ColorEnum; public class Main { public static void main(String[] arrstring) { ColorEnum colorEnum = ColorEnum.YELLOW; switch (1.$SwitchMap$com$learn$java$ColorEnum[colorEnum.ordinal()]) { case 1: { System.out.println("red"); break; } case 2: { System.out.println("yellow"); break; } default: { System.out.println("other"); } } } }

上面的反編譯結果表明,switch藉助枚舉類的序號實現對枚舉類的支持。

總結:其實switch只支持整型,其他數據類型都是轉換成整型後才使用的switch。


[f2h0b53ohn ] Java Switch對各類型支持實現原理已經有225次圍觀

http://coctec.com/docs/java/show-post-232403.html