<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java 語言中十大“坑爹”功能!

          共 1369字,需瀏覽 3分鐘

           ·

          2020-08-15 12:21

          作者:踐行精神自由


          鏈接:https://www.sohu.com/a/357927861_115128


          作為一門面向?qū)ο蟮木幊陶Z言,Java憑借其簡單易用、功能強(qiáng)大的特點(diǎn)受到了廣大編程愛好者的青睞,伴隨著開源社區(qū)的推波助瀾,Java語言更是席卷全球,勢不可擋,在世界各地都有Java技術(shù)的從業(yè)者,它也常年高居編程語言排行榜的首位,足以表明Java的強(qiáng)悍與王者之風(fēng)。

          然而,即便是如此強(qiáng)大的編程語言,也有很多“坑爹”的功能,稍不注意,我們就會掉入坑里,輕則遭到同事的嘲笑和鄙視,重則造成悲慘后果而不得不跑路。

          當(dāng)然,坑爹這個詞加上了雙引號,因?yàn)榇蟛糠謺r候,都是由于我們不夠熟練、違反我們的常識才造成了令人不愉快的后果。

          今天我們就來梳理一下Java中最“坑爹”、最違反常識的功能點(diǎn),以排行榜的方式發(fā)布,以饗讀者。說明一下,本文中的代碼基于JDK8來編譯實(shí)現(xiàn)。


          10. switch必須加上break才結(jié)束

          對于多重分支選擇,一系列的if-else-if語句會讓代碼的可讀性變差,建議使用switch語句來代替,然而switch case中的分支判斷,必須加上break語句才會中止其它c(diǎn)ase的執(zhí)行,比如:

          intcount?=?1;switch(count){case1:   System.?out.println(?"one");case2:   System.?out.println(?"two");case3:   System.?out.println(?"three");}
          上面的代碼會輸出:
          onetwothree
          然而,這并不是我們想要的,或者說違反了我們的常識。滿足了某種條件,當(dāng)然就只需要執(zhí)行這種條件下的邏輯即可,其他的case應(yīng)該不予理會、直接跳過,象上面這段代碼,只需要輸出one就行了。當(dāng)然,在每個case結(jié)尾處加上break就可以達(dá)到我們期望的效果。
          這個功能點(diǎn)稍顯“坑爹”,也是初學(xué)者常犯的錯誤,所以它也光榮上榜,排名第10位。


          9.?邏輯運(yùn)算符的“短路”現(xiàn)象


          使用邏輯運(yùn)算符時,我們會遇到“短路”的現(xiàn)象:一旦能夠確定整個表達(dá)式的值,就不會計(jì)算余下的部分了,當(dāng)然,這個功能點(diǎn)其實(shí)是非常有用的,但對于初學(xué)者來說,可能會感覺比較驚訝,使用不當(dāng)就會產(chǎn)生“坑爹”后果。比如下面的代碼:

          intnum=?1;System.out.println(?false&&?((?num++)==?1));System.out.println( num);
          就會輸出false和1,因?yàn)檫壿嬇c&&的前半部分為false,不管后半部分為true還是false,整個表達(dá)式都會返回false,所以就不會再計(jì)算后面的部分了,如果把false改成true,那么后半部分就會得到執(zhí)行,num也就變成2了。

          它在“坑爹”榜單中位列第9位。


          8.?數(shù)組下標(biāo)從零開始


          Java程序員都清楚,數(shù)組的下標(biāo)是從零開始的,比如,我們要遍歷一個數(shù)組,可以采用如下的方式:

          int[]?arr?=?newint[]{?1,?3,?5,?7,?9};for(?inti=?0;i???System.?out.println(?"the?element?is:"+arr[i]);}


          這跟我們?nèi)粘I钪械慕?jīng)驗(yàn)是相違背的,正常情況都是從第1個元素開始計(jì)數(shù)的,特別是對于初學(xué)者來說有點(diǎn)難以接受,會覺得很驚訝。即使對于經(jīng)驗(yàn)豐富的程序員來說,有些地方也需要格外注意,比如:

          String?str?=?"hello?world";System. out.println(str.charAt( 1));


          我們知道,charAt的作用是獲取字符串中某個位置的字符,然而,上面的代碼并不是輸出第一個字符h,而是e,因?yàn)閿?shù)組是從零開始計(jì)數(shù)的,這個也是比較“坑爹”啊。當(dāng)然,設(shè)計(jì)者這么做的原因是考慮到了內(nèi)存偏移量的因素。

          每次在編寫這樣的代碼時,都需要做這樣的1到0的映射和轉(zhuǎn)換(熟練了就是下意識的轉(zhuǎn)換),確實(shí)也有點(diǎn)“坑爹”,所以它也不能幸免,排在第8位。


          7.?ArrayList遍歷刪除時報(bào)錯


          Talk is cheap,先上代碼:

          publicstaticvoidmain(String[]?args){List list= newArrayList;
          list.add(?"abc");list.add(?"bc");list.add(?"bc");list.add(?"abcd");list.add(?"abcdef");//報(bào)錯intlength = list.size;
          for(?inti?=?0;i? if(?list.get(i).equals(?"bc")){ list.remove(i); } }}


          想從ArrayList中刪除某個元素,于是,我們就寫了上面的代碼,但是它卻拋出了IndexOutOfBoundsException異常,原因是ArrayList在刪除元素后會重新計(jì)算數(shù)量,把list.size放在for循環(huán)中即可:

          for(?inti=?0;iif(?list.get(i).equals(?"bc")){   list.remove(i); }}


          當(dāng)然,這種方法也存在問題,建議使用迭代器的方式來刪除元素。

          對于不太熟練的程序員來說,有時候就會掉入這樣的陷阱之中。這是排名第7的情況。


          6.?字符轉(zhuǎn)成數(shù)字的坑


          有時候,我們想把字符直接通過類型轉(zhuǎn)換變成整數(shù),比如像下面這樣:

          charsymbol?=?'8';System. out.println(( int) symbol);


          我們想要的結(jié)果是8,然而,上面的代碼卻輸出了56,略顯“坑爹”,具體原因參考ASCII的知識。

          5.?while循環(huán)體的“障眼法”


          對于while循環(huán)語句,如果你沒有加上大括號,即使后面的語句挨在一起,也只會執(zhí)行第一條statement,比如:

          inti?=?0;while(i++3)System.?out.print(?"A");System. out.print( "B");


          上面的代碼會輸出:

          AAAB

          而不是3個A、3個B,更“坑爹”的是,如果兩條語句放在一行上,迷惑性會更大:

          inti?=?0;while(i++3)System. out.print( "A");System. out.print( "B");


          上面這種寫法同樣是輸出AAAB。所以,象這樣的情況,哪怕只有一條語句,也建議加上大括號,完美避坑。
          4. Integer類有緩存

          這個功能點(diǎn)也是面試的高頻熱點(diǎn)之一,稍不注意,也有可能被帶入溝里,我們看看下面這段代碼:

          publicstaticvoidmain(String[]?args){   Integer?a?=?100;   Integer?b?=?100;   Integer?c?=?200;   Integer?d?=?200;   System.?out.println(a==b);   System.?out.println(c==d);}


          上面的代碼竟然輸出:

          truefalse


          這確實(shí)太出乎意料了,同樣的代碼,只是數(shù)值不同(而且差別不太大的樣子),就產(chǎn)生了不一樣的輸出,這也太離譜了。原來,Integer中有一個靜態(tài)內(nèi)部類IntegerCache,在類加載的時候,它會把[-128, 127]之間的值緩存起來,而Integer a = 100這樣的賦值方式,會首先調(diào)用Integer類中的靜態(tài)valueOf方法,這個方法會嘗試從緩存里取值,如果在這個范圍之內(nèi)就不用重新new一個對象了:

          public static Integer?valueOf(inti){if(i?>=?IntegerCache.low?&&?i?<=?IntegerCache.high)   return IntegerCache.cache[i?+?(-IntegerCache.low)];   return new Integer(i);}


          此功能入選“坑爹”排行榜的第4名。


          3. 空方法體導(dǎo)致死循環(huán)

          如果循環(huán)的方法體為空,則會導(dǎo)致死循環(huán),比如,下面的代碼打印出數(shù)字1,2,3:

          inti?=?1;while(i4){    System.?out.println(i++);}


          如果你在敲鍵盤的時候,不小心在while結(jié)尾處加了一個分號(如果方法體沒有加大括號,更容易產(chǎn)生這種情況):

          inti?=?1;while(i4);{System.?out.println(i++);}


          你猜怎么著,上面的代碼可以正常編譯并運(yùn)行,然而,它卻陷入了死循環(huán)......是不是非?!翱拥??for循環(huán)也存在類似的情況。

          它高居排行榜的第3位。
          2. 神奇的=+


          我們知道,對于類似a=a+b這樣的賦值語句,有一種簡寫方式:a +=b,然而,如果你不小心寫成了a =+ b,結(jié)果又會是什么呢?我們看看下面的代碼:

          inti?=?100;i?=+?2;?//注意,加號在后面System. out.println(i);


          上面的代碼既不會輸出102,也不會報(bào)錯,而是輸出2,這的確出乎意料,完全不是我們期望的結(jié)果,太神奇了,非常的“坑爹”。

          所以,它排名第2,穩(wěn)居榜眼的位置。


          1.?Java注釋能夠識別Unicode


          先看看代碼:

          publicstaticvoidmain(String[]?args){    //?u000d?System.out.println("Hello?World!");}


          乍一看,代碼都被注釋掉了,當(dāng)然不會輸出任何東西,然而,它還是輸出每個程序員都倍感親切的Hello World,這是因?yàn)?,unicode解碼發(fā)生在代碼編譯之前,編譯器將u樣式的代碼進(jìn)行文本轉(zhuǎn)義,即使是注釋也是這樣,然后u000a被轉(zhuǎn)換成n換行符,所以println代碼得以正常執(zhí)行。

          這樣的功能著實(shí)“坑爹”,極其違反常識,它必須要上榜,必須要榮登狀元的位置。

          以上就是編者總結(jié)的Java語言中十大“坑爹”的功能點(diǎn),你是否認(rèn)同這樣的排名?你覺得有哪些功能更應(yīng)該入選此榜單?歡迎后臺留言討論!

          ? 開發(fā)者全社區(qū)?

          5T技術(shù)資源大放送!包括但不限于:Android,Python,Java,大數(shù)據(jù),人工智能,AI等等。關(guān)注公眾號后回復(fù)「2T」,即可免費(fèi)獲取!!
          瀏覽 38
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产无码操逼视频 | 家庭乱伦五月天 | 亚洲AV综合色区无码国产播放 | 欧美国产一级 | 免费看二极一级黄色片 |