一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 聊聊Java的switch為什么不支持long

聊聊Java的switch為什么不支持long

2022-02-15 15:34聞香識代碼 Java教程

這篇文章主要介紹了Java的switch為什么不支持long,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Java為什么不浪(long)

學而時習之不亦說乎,繼續溫習Java。

今天使用switch時,不小心寫了如下代碼,報錯如下。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
   long s = 20L;
   switch (s) {
   case 20L:
    System.out.println("haha");
    break;
 
   default:
    break;
   }
 }
/*
Cannot switch on a value of type long. Only convertible int values, strings or enum variables are permitted
*/

疑問

1.為什么可以支持byte、char、short、int,不能支持long呢?

2.為什么可支持enum和String?注意enum是JDK5引入,switch支持String是JDK7支持

分析

1.為什么可以支持byte、char、short、int,不能支持long呢?

發現一個共同點,這些都是基礎數據類型中的整數,并且最大不超過int。正好去研究一下官方文檔說明。

Compilation of switch statements uses the tableswitch and lookupswitch instructions.
The tableswitch instruction is used when the cases of the switch can be efficiently represented as indices into a table of target offsets.
The default target of the switch is used if the value of the expression of the switch falls outside the range of valid indices.
The Java Virtual Machine's tableswitch and lookupswitch instructions operate only on int data. Because operations on byte, char, or short values are internally promoted to int, a switch whose expression evaluates to one of those types is compiled as though it evaluated to type int.

意思是說switch的編譯會用到兩個指令,tablesswitch和lookupswitch。而這2個指令指令只會運行在int指令下,低于int的正數類型會被轉為int類型,而這一點和short、byte等類型在計算時會被轉為int來處理的表現是一致的。

到此為止,我們知道第一個問題的答案了。在編譯時,switch被編譯成對應的2個實現方式的指令,這2種指令只支持int類型。

2.為什么可支持enum和String?

按照網絡資料反編譯對照來看,enum最終也是轉換為enum的int序號來適應switch的。而String類型要怎么和int對應起來呢,有一種方式叫hashcode計算,最后可以得出一個數值,把這個控制在int范圍內,就能適應switch的要求了。

編程思想匯總

1.類比switch支持enum和String的實現。

在程序開發中,由于第三方庫或者工具類中方法參數限制,調用者必須對參數做一些轉換才能調用這些方法的情況下,我們可以使用適配器模式來抹平這種差異。

2.類比switch在JDK版本在5時引入enum的支持,在7時引入對String支持。

在程序開發中,版本迭代是最常見也是能夠很好權衡開發速度和質量的方式。類似一個App程序,我們花2年可以把它的bug數量降低到萬分之一,但市場不會留給公司那么多時間。所以實際上每家公司都是會先開發出一個有基本功能特性的App,然后沒2周或者一個月迭代一個版本,通過迭代把這個App完善好。

我們的代碼開發大家一定注意,不追求盡善盡美。先讓業務能夠跑起來,然后我們再進一步追求性能、代碼可讀性達到90甚至98分的程度。

switch能否作用于Long,string上

switch原則上只能作用于int型上,

但是,char、float、char等可以隱式的轉換為int 型,而long,string不可以,

所以呢,switch 不可以作用于Long, string 類型的變量上。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/xiaohu21/article/details/106950136

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 校花被拖到野外伦小说 | 无删减影视免费观看 | 3d美女触手怪爆羞羞漫画 | 99re5在线精品视频热线 | 91系列在线观看免费 | 久久久伊人影院 | 欧美四级无删版影片 | 西施打开双腿下面好紧 | daring国家队在线观看樱花动漫 | 青青青青青操 | 污书屋| 洗濯屋H纯肉动漫在线观看 武侠艳妇屈辱的张开双腿 午夜在线观看免费观看 视频 | 好涨好爽好大视频免费 | 女人把扒开给男人爽 | 四虎影视免费观看免费观看 | 亚洲99久久无色码中文字幕 | 高清不卡日本v在线二区 | 青青青手机在线视频 | 亚洲福利二区 | 亚洲成人网导航 | 欧美日韩国产一区二区三区不卡 | 2022日韩理论片在线观看 | 日本一区二区高清免费不卡 | 欧美精品日韩 | 日韩毛片基地一区二区三区 | 蛮荒的童话未删减在线观看 | 国产三级精品91三级在专区 | avidolz中文版 | 国产精品青青青高清在线观看 | 亚洲欧美综合人成野草 | 91精品天美精东蜜桃传媒免费 | 精品日韩欧美一区二区三区 | 国产亚洲福利精品一区二区 | 国产v日韩v欧美v精品专区 | 激情婷婷综合久久久久 | 男女福利视频 | 国产成人在线播放视频 | 日本三级免费看 | 日本高清va不卡视频在线观看 | 亚洲国产精品婷婷久久久久 | 天天视频国产精品 |