<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 語言“坑爹” TOP 10

          共 6052字,需瀏覽 13分鐘

           ·

          2022-06-25 11:26

          往期熱門文章:

          1、40 個 SpringBoot 常用注解:讓生產(chǎn)力爆表!

          2、3種常見的數(shù)據(jù)脫敏方案

          3、BigDecimal使用不當(dāng),造成P0事故!

          4、改造BeanUtils,優(yōu)雅實(shí)現(xiàn)List數(shù)據(jù)拷貝

          5、SpringBoot 啟動時自動執(zhí)行代碼的幾種方式,還有誰不會??

          blog.csdn.net/weixin_44742132

          推薦:https://www.xttblog.com/?p=5347

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

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

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

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

          Java程序員都清楚,數(shù)組的下標(biāo)是從零開始的,比如,我們要遍歷一個數(shù)組,可以采用如下的方式:
          int[] arr = new int[]{1,3,5,7,9};
          for(int i=0;i<arr.length;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位。

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

          Talk is cheap,先上代碼:
          public static void main(String[] args) {
             List<String> list = new ArrayList<String>();
             list.add("abc");
             list.add("bc");
             list.add("bc");
             list.add("abcd");
             list.add("abcdef");
             //報(bào)錯
             int length = list.size();
             for(int i = 0;i < length;i++){
                 if(list.get(i).equals("bc")){
                     list.remove(i);
                 }
             }
          }
          想從ArrayList中刪除某個元素,于是,我們就寫了上面的代碼,但是它卻拋出了IndexOutOfBoundsException異常,原因是ArrayList在刪除元素后會重新計(jì)算數(shù)量,把list.size放在for循環(huán)中即可:
          for(int i=0;i<list.size();i++){
             if(list.get(i).equals("bc")){
                 list.remove(i);
             }
          }
          當(dāng)然,這種方法也存在問題,建議使用迭代器的方式來刪除元素。
          對于不太熟練的程序員來說,有時候就會掉入這樣的陷阱之中。這是排名第7的情況。

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

          有時候,我們想把字符直接通過類型轉(zhuǎn)換變成整數(shù),比如像下面這樣:
          char symbol = '8';
          System.out.println((int) symbol);
          我們想要的結(jié)果是8,然而,上面的代碼卻輸出了56,略顯“坑爹”,具體原因參考ASCII的知識。

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

          對于while循環(huán)語句,如果你沒有加上大括號,即使后面的語句挨在一起,也只會執(zhí)行第一條statement,比如:
          int i = 0;
          while(i++<3)
                 System.out.print("A");
                 System.out.print("B");
          上面的代碼會輸出:AAAB
          而不是3個A、3個B,更“坑爹”的是,如果兩條語句放在一行上,迷惑性會更大:
          int i = 0;
          while(i++<3)
                 System.out.print("A");System.out.print("B");
          上面這種寫法同樣是輸出AAAB。所以,象這樣的情況,哪怕只有一條語句,也建議加上大括號,完美避坑。

          04.Integer類有緩存

          這個功能點(diǎn)也是面試的高頻熱點(diǎn)之一,稍不注意,也有可能被帶入溝里,我們看看下面這段代碼:
          public static void main(String[] args){
             Integer a = 100;
             Integer b = 100;
             Integer c = 200;
             Integer d = 200;
             System.out.println(a==b);
             System.out.println(c==d);
          }
          上面的代碼竟然輸出:
          true
          false
          這確實(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(int i) {
             if (i >= IntegerCache.low && i <= IntegerCache.high)
                 return IntegerCache.cache[i + (-IntegerCache.low)];
             return new Integer(i);
          }
          此功能入選“坑爹”排行榜的第4名。

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

          如果循環(huán)的方法體為空,則會導(dǎo)致死循環(huán),比如,下面的代碼打印出數(shù)字1,2,3:
          int i = 1;
          while(i<4){
             System.out.println(i++);
          }
          如果你在敲鍵盤的時候,不小心在while結(jié)尾處加了一個分號(如果方法體沒有加大括號,更容易產(chǎn)生這種情況):
          int i = 1;
          while(i<4);{
             System.out.println(i++);
          }
          你猜怎么著,上面的代碼可以正常編譯并運(yùn)行,然而,它卻陷入了死循環(huán)。。。是不是非?!翱拥??for循環(huán)也存在類似的情況。
          它高居排行榜的第3位。

          02.神奇的=+

          我們知道,對于類似a=a+b這樣的賦值語句,有一種簡寫方式:a +=b,然而,如果你不小心寫成了a =+ b,結(jié)果又會是什么呢?我們看看下面的代碼:
          int i = 100;
          i =+ 2;  //注意,加號在后面
          System.out.println(i);
          上面的代碼既不會輸出102,也不會報(bào)錯,而是輸出2,這的確出乎意料,完全不是我們期望的結(jié)果,太神奇了,非常的“坑爹”。
          所以,它排名第2,穩(wěn)居榜眼的位置。

          01.Java注釋能夠識別Unicode

          先看看代碼:
          public static void main(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í)“坑爹”,極其違反常識,它必須要上榜,必須要榮登狀元的位置。

          最近熱文閱讀:

          1、40 個 SpringBoot 常用注解:讓生產(chǎn)力爆表!
          2、3種常見的數(shù)據(jù)脫敏方案
          3、BigDecimal使用不當(dāng),造成P0事故!
          4、改造BeanUtils,優(yōu)雅實(shí)現(xiàn)List數(shù)據(jù)拷貝
          5、讓人上癮的新一代開發(fā)神器,徹底告別Controller、Service、Dao等方法
          6、SpringBoot 啟動時自動執(zhí)行代碼的幾種方式,還有誰不會??
          7、延時消息常見實(shí)現(xiàn)方案
          8、勁爆!Java 通用泛型要來了。。
          9、如何寫出讓同事吐血的代碼?
          10、遭棄用的 Docker Desktop 放大招!宣布支持 Linux
          關(guān)注公眾號,你想要的Java都在這里

          瀏覽 49
          點(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>
                  日本一区视频在线观看 | 久久久黄色 | 国产精品77777 | 18禁国产精品久久久久 | 多人操逼 |