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
[f2h0b53ohn ] Java Switch對各類型支持實現原理已經有225次圍觀