面試題:你真的會三目運算符嗎?

面試題

廢話很少說,直接上題:java

三目運算符面試題

提問:當 a=1,b=2 時,test1 方法的執行結果是什麼?思考一分鐘。面試

答案:微信

答案

解析

在使用三目運算符時,儘可能保證兩個返回值的類型一致,否則會觸發類型轉換,轉換規則以下:spa

  1. 若是返回值 X 和返回值 Y 是同種類型,那麼返回類型毫無疑問就是這種類型。指針

  2. 若是兩個返回值 X 和 Y 的類型不一樣,那麼返回值類型爲他們兩最接近的父類。舉例:code

    // String 和 Boolean 都實現了 Serializable 接口
    Serializable serializable = a == b ? "true" : Boolean.FALSE;
    // 全部類都繼承了 Object 類
    Object o = a == b ? new ArrayList<>() : new TernaryOperatorDemo();
    複製代碼
  3. 對於基本數據類型,若是其中一個返回值 X 類型爲byteshort或者char,另外一個返回值 Y 類型爲int,那麼若在編譯期就能判斷出 Y 的取值範圍在 X 的取值範圍以內,則返回類型爲 X 的類型,反之則爲 Y 的類型。若是返回值 X 類型不爲以上幾種,則會觸發隱藏類型轉換。cdn

  4. 當基本數據類型和對象數據類型相遇時,三目運算符默認返回結果爲基本數據類型。對象

瞭解以上規則以後,咱們再看來一下 test1 方法。blog

private static void test1(int a, int b) {
  // 觸發隱藏類型轉換,int 類型 9 轉爲 9.0D
  System.out.println(a == b ? 9.9 : 9);
  // 編譯期判斷,98 在 char 以內,轉爲 b
  System.out.println(a == b ? 'a' : 98);
  // 編譯期判斷,超出char範圍,統一轉 int
  System.out.println(a == b ? 'a' : Integer.MAX_VALUE);
  // 編譯期時沒法判斷 b 的取值,觸發隱藏類型轉換,統一轉 int
  System.out.println(a == b ? 'a' : b);
  System.out.println(a != b ? 'a' : b);

  Map<String, Long> map = new HashMap<>();
  map.put("b", 1L);
  // 基本數據類型和對象數據類型相遇時,默認轉爲基本數據類,
  // map.get("a") 返回 null,轉爲基本數據類型時,報空指針異常
  System.out.println(map == null ? -1L : map.get("a"));

}
複製代碼

做業

如何修改 test1 方法,使得代碼運行時不拋空指針異常,請至少提供一種解決方案。繼承


本文首發於我的微信公衆號:Coder小黑,歡迎你們掃碼關注哦。

Coder小黑
相關文章
相關標籤/搜索