成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 中又一個你天天使用,但是不一定知道的知識點

開發(fā) 后端
如果還不知道可以這樣用的小伙伴,那你今天知道了,不過阿粉相信小伙伴都知道這個特性,但是這里阿粉提兩個問題,看看聰明的你能不能答出來。

[[435173]]

大家都知道當我們在進行條件判斷的時候除了可以使用 if-else 之外,還可以是用 switch,而且在 JDK 7 之后在 switch 中還增加了 String 類型的支持,如下代碼所示。

  1. public static void testSwitch(String language) { 
  2.         switch (language) { 
  3.             case "C++"
  4.                 System.out.println("C++"); 
  5.                 break; 
  6.             case "Java"
  7.                 System.out.println("Java"); 
  8.                 break; 
  9.             case "Python"
  10.                 System.out.println("Python"); 
  11.             default
  12.                 System.out.println("default"); 
  13.                 break; 
  14.         } 
  15.     } 

如果還不知道可以這樣用的小伙伴,那你今天知道了,不過阿粉相信小伙伴都知道這個特性,但是這里阿粉提兩個問題,看看聰明的你能不能答出來。

如果 language 為 null,即 testSwitch(null) 會輸出什么?

swtich() 支持String 的原理是什么?

看到這里請停下來,思考五秒鐘。

  1.  
  2.  
  3.  
  4.  

好,我們來看下上面兩個問題,首先如果對于問題一你要是回答會輸出default 那么阿粉告訴你,這是錯誤的。不信的話,我們實踐一下,畢竟實踐是檢驗真理的唯一標準。

從上面的輸出我們可以看到,已經(jīng)報了空指針的異常了,到這里可能有些小伙伴就疑惑了,上面的代碼看起來沒什么特別的啊,null 傳進去應該走到 default 分支才對啊,為什么會報空指針呢?有這個疑問的小伙伴也不要捉急,看完第二個問題的答案,你就知道為什么了。

同樣的要搞清楚為什么問題一的答案是空指針,我們就需要知道 switch 中支持 String 的原理是什么。下面我們來看看第二個問題。首先我們將這個代碼通過 Javac 編譯一下,執(zhí)行命令:javac SwitchTest.java,我們就可以得到編譯后的 SwitchTest.class 文件,再通過反編譯我們可以得到下面的內(nèi)容,這里反編譯可以直接將 class 文件拖進 idea 中即可。

  1. // 
  2. // Source code recreated from a .class file by IntelliJ IDEA 
  3. // (powered by FernFlower decompiler) 
  4. // 
  5. package org.fenixsoft.clazz; 
  6. public class SwitchTest { 
  7.     public SwitchTest() { 
  8.     } 
  9.     public static void main(String[] var0) { 
  10.         testSwitch((String)null); 
  11.     } 
  12.     public static void testSwitch(String var0) { 
  13.         byte var2 = -1; 
  14.         switch(var0.hashCode()) { 
  15.         case -1889329924: 
  16.             if (var0.equals("Python")) { 
  17.                 var2 = 2; 
  18.             } 
  19.             break; 
  20.         case 65763: 
  21.             if (var0.equals("C++")) { 
  22.                 var2 = 0; 
  23.             } 
  24.             break; 
  25.         case 2301506: 
  26.             if (var0.equals("Java")) { 
  27.                 var2 = 1; 
  28.             } 
  29.         } 
  30.         switch(var2) { 
  31.         case 0: 
  32.             System.out.println("C++"); 
  33.             break; 
  34.         case 1: 
  35.             System.out.println("Java"); 
  36.             break; 
  37.         case 2: 
  38.             System.out.println("Python"); 
  39.         default
  40.             System.out.println("default"); 
  41.         } 
  42.     } 

到這里相信大家就知道為什么了,很顯然 Switch 支持 String 底層的原理是使用了 String 的 hasecode 和 equals 方法。通過得到入?yún)⒆址?hasecode 來決定進入哪個分支。大家都知道 hasecode 的返回值是 int 類型,所以說即使傳入的參數(shù)類型的字符串,底層還是使用的整型來進行判斷的。

而且到這里,大家也知道了為什么問題一的答案是會出現(xiàn)空指針了,因為這里在調(diào)用 hasecode 的時候,很明顯會出現(xiàn)空指針異常。

這就告訴我們在進行 switch string 的使用的時候,一定要進行入?yún)⒌姆?NULL 校驗,這一點在阿里巴巴的手冊中也有明確的強制要求。

同時通過上面反編譯后的代碼,我們也可以看到,參數(shù) String 是區(qū)分大小寫的,因為里面使用了 equals 進行判斷,所以我們也要注意字符串的大小寫,避免出現(xiàn)問題。

為了驗證是真的是采用 hasecode ,我們可以將上面代碼中涉及到了幾個字符串的 hasecode 輸出出來驗證一下。

  1. public static void main(String[] args) { 
  2.       testSwitch(null); 
  3.     System.out.println("C++".hashCode()); 
  4.     System.out.println("Java".hashCode()); 
  5.     System.out.println("Python".hashCode()); 

可以看到輸出的 hasecode 和反編譯后的 hasecode 是一致的。

看到這里的小伙伴我們再延伸一下,既然這里是在編譯時期就生成了 hasecode ,那說明我們不能傳入一個動態(tài)生成的字符串,也就是下面的寫法會無法通過編譯。

雖然看上去都是一個字符串,但是明顯這種形式是不行的,因為沒辦法在編譯的時候就獲得 hasecode,自然也就不可以這些寫了,相信小伙伴們在之前寫代碼的時候也遇到過這種情況,但是當時可能并不知道是為什么,只知道要定義個常量或者字符串字面量,相信看完這篇文章的你,就知道是為什么了。 

總結一下今天阿粉帶大家看了一個 Switch String 類型參數(shù)的實現(xiàn)原理,有些知識點在我們平時工作中雖然會經(jīng)常用到,但是并不會深入去研究原理。

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2021-02-26 09:04:22

數(shù)組ArrayListHashMap

2020-01-03 10:11:01

數(shù)據(jù)庫安全SQL

2016-11-28 11:19:48

術語神秘

2020-08-30 14:31:40

Python編程語言開發(fā)

2022-12-26 09:16:45

Guava架構模型

2018-02-08 09:11:25

Linux命令rm

2022-05-16 07:31:51

Java進度條代碼

2024-03-21 17:29:45

2021-05-07 20:08:52

人工智能AI游戲

2021-05-08 16:33:14

人工智能游戲機器學習

2019-11-21 10:59:16

IPv4IPv6網(wǎng)絡

2020-07-29 07:37:20

Git 修復項目

2012-10-16 09:52:27

數(shù)據(jù)結構

2018-03-09 10:34:48

顯卡參數(shù)超頻

2022-02-06 20:55:39

jsEsbuild項目

2021-11-01 07:27:25

開發(fā)Java泛化

2018-05-09 15:16:46

電競顯示器外觀

2018-01-18 05:20:59

2020-02-18 20:28:23

AI人工智能

2023-05-14 23:38:43

Glarity用戶視頻
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产乱码精品1区2区3区 | 久久大| 久久精品16 | av网站免费在线观看 | 欧美成年黄网站色视频 | 97色在线观看免费视频 | 成人欧美一区二区三区色青冈 | 久久青| 欧美一区二区在线播放 | 久久久男人的天堂 | 久久久久久免费精品一区二区三区 | 91精品国产综合久久久久久丝袜 | 色综合成人网 | 99九九视频 | 国产精品成人一区二区 | 国产一区二| av在线免费观看网站 | 久久久黑人 | 在线播放中文字幕 | 国内毛片毛片毛片毛片 | 99热热热热| 国产一区 | 99久久精品免费看国产免费软件 | 免费在线观看av片 | 在线成人免费视频 | 日日骚视频 | 日本亚洲一区 | 一级黄色网页 | 国产精品久久久久久久久免费桃花 | 夜夜骑天天干 | 久久久国产精品视频 | 日韩免费高清视频 | 国产日韩亚洲欧美 | 亚洲精品在线免费观看视频 | 国产激情视频 | 中文字幕国产 | 久久久久久国产 | 久久国产精品一区二区三区 | 日韩久久中文字幕 | 欧美 日韩 在线播放 | 国产一区二区精品 |