<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 語(yǔ)言“坑爹” TOP 10,第一你絕對(duì)想不到!

          共 5819字,需瀏覽 12分鐘

           ·

          2022-06-21 12:07


          上一篇:“精準(zhǔn)紅碼”事件,查清楚了!史上最慘程序員干的

          來(lái)源:blog.csdn.net/weixin_44742132

          ?

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

          然而,即便是如此強(qiáng)大的編程語(yǔ)言,也有很多“坑爹”的功能,稍不注意,我們就會(huì)掉入坑里,輕則遭到同事的嘲笑和鄙視,重則造成悲慘后果而不得不跑路。當(dāng)然,坑爹這個(gè)詞加上了雙引號(hào),因?yàn)榇蟛糠謺r(shí)候,都是由于我們不夠熟練、違反我們的常識(shí)才造成了令人不愉快的后果。

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

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

          對(duì)于多重分支選擇,一系列的if-else-if語(yǔ)句會(huì)讓代碼的可讀性變差,建議使用switch語(yǔ)句來(lái)代替,然而switch case中的分支判斷,必須加上break語(yǔ)句才會(huì)中止其它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");
          }

          上面的代碼會(huì)輸出:

          one
          two
          three

          然而,這并不是我們想要的,或者說(shuō)違反了我們的常識(shí)。滿足了某種條件,當(dāng)然就只需要執(zhí)行這種條件下的邏輯即可,其他的case應(yīng)該不予理會(huì)、直接跳過(guò),象上面這段代碼,只需要輸出one就行了。當(dāng)然,在每個(gè)case結(jié)尾處加上break就可以達(dá)到我們期望的效果。

          這個(gè)功能點(diǎn)稍顯“坑爹”,也是初學(xué)者常犯的錯(cuò)誤,所以它也光榮上榜,排名第10位。

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

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

          int num = 1;
          System.out.println(false && ((num++)==1));
          System.out.println(num);

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

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

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

          Java程序員都清楚,數(shù)組的下標(biāo)是從零開(kāi)始的,比如,我們要遍歷一個(gè)數(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個(gè)元素開(kāi)始計(jì)數(shù)的,特別是對(duì)于初學(xué)者來(lái)說(shuō)有點(diǎn)難以接受,會(huì)覺(jué)得很驚訝。即使對(duì)于經(jīng)驗(yàn)豐富的程序員來(lái)說(shuō),有些地方也需要格外注意,比如:

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

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

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

          07.ArrayList遍歷刪除時(shí)報(bào)錯(cuò)

          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)錯(cuò)
             int length = list.size();
             for(int i = 0;i < length;i++){
                 if(list.get(i).equals("bc")){
                     list.remove(i);
                 }
             }
          }

          想從ArrayList中刪除某個(gè)元素,于是,我們就寫(xiě)了上面的代碼,但是它卻拋出了IndexOutOfBoundsException異常,原因是ArrayList在刪除元素后會(huì)重新計(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)然,這種方法也存在問(wèn)題,建議使用迭代器的方式來(lái)刪除元素。

          對(duì)于不太熟練的程序員來(lái)說(shuō),有時(shí)候就會(huì)掉入這樣的陷阱之中。這是排名第7的情況。

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

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

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

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

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

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

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

          上面的代碼會(huì)輸出:AAAB

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

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

          上面這種寫(xiě)法同樣是輸出AAAB。所以,象這樣的情況,哪怕只有一條語(yǔ)句,也建議加上大括號(hào),完美避坑。

          04.Integer類(lèi)有緩存

          這個(gè)功能點(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)生了不一樣的輸出,這也太離譜了。原來(lái),Integer中有一個(gè)靜態(tài)內(nèi)部類(lèi)IntegerCache,在類(lèi)加載的時(shí)候,它會(huì)把[-128, 127]之間的值緩存起來(lái),而Integer a = 100這樣的賦值方式,會(huì)首先調(diào)用Integer類(lèi)中的靜態(tài)valueOf方法,這個(gè)方法會(huì)嘗試從緩存里取值,如果在這個(gè)范圍之內(nèi)就不用重新new一個(gè)對(duì)象了:

          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)的方法體為空,則會(huì)導(dǎo)致死循環(huán),比如,下面的代碼打印出數(shù)字1,2,3:

          int i = 1;
          while(i<4){
             System.out.println(i++);
          }

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

          int i = 1;
          while(i<4);{
             System.out.println(i++);
          }

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

          它高居排行榜的第3位。

          02.神奇的=+

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

          int i = 100;
          i =+ 2;  //注意,加號(hào)在后面
          System.out.println(i);

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

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

          01.Java注釋能夠識(shí)別Unicode

          先看看代碼:

          public static void main(String[] args){
              // \u000d System.out.println("Hello World!");
          }

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

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

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

           · END ·

          熱門(mén)推薦:

          PS:如果覺(jué)得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊、轉(zhuǎn)發(fā)、在看
          ?


          瀏覽 35
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  аⅴ天堂 在线 | 国产精品一卡2卡3卡4卡5卡免费网站 | 视频免费一区 | 人人色综合 | 成年视频在线 |