總結(jié)Java程序員最常犯Top 10錯誤

人非圣賢轿钠,孰能無過雹熬。都說Java語言是一門簡單的編程語言,基于C++演化而來谣膳,剔除了很多C++中的復雜特性竿报,但這并不能保證Java程序員不會犯錯。那么對于廣大的Java程序員來說继谚,它們最常犯的10個錯誤是什么呢烈菌?本文通過總結(jié)出Java程序員最常犯的10大錯誤,可以有效地幫組Java后來者少走彎路,少加班芽世,并寫出更健壯的應用程序挚赊。

1. 數(shù)組轉(zhuǎn)ArrayList

為了實現(xiàn)把一個數(shù)組轉(zhuǎn)換成一個ArrayList,很多Java程序員會使用如下的代碼:

Arrays.asList確實會返回一個ArrayList對象济瓢,但是該類是Arrays類 中一個私有靜態(tài)內(nèi)部類荠割,而不是常見的java.util.ArrayList類。這個java.util.Arrays.ArrayList類具有 set()旺矾,get()蔑鹦,contains()等方法,但是不具有任何添加或移除元素的任何方法箕宙。因為該類的大小(size)是固定的嚎朽。為了創(chuàng)建出一個真正的ArrayList,代碼應該如下所示:

我們知道柬帕,ArrayList的構(gòu)造方法可以接受一個Collection類型的對象哟忍,而我們的 java.util.Arrays.ArrayList正好也是它的一個子類。實際上陷寝,更加高效的代碼示例是:

在這里還是要推薦下我自己建的Java學習裙:574加上二五三再加上075锅很,群里都是學Java開發(fā)的,如果你正在學習Java 凤跑,小編歡迎你加入爆安,大家都是軟件開發(fā)黨,不定期分享干貨(只有Java軟件開發(fā)相關(guān)的)饶火,包括我自己整理的一份2018最新的Java進階資料和高級開發(fā)教程鹏控,歡迎進階中和進想深入java的小伙伴

2. 數(shù)組是否包含特定值

為了檢查數(shù)組中是否包含某個特定值致扯,很多Java程序員會使用如下的代碼:

就功能而言肤寝,該代碼是正確無誤的抖僵,但在數(shù)組轉(zhuǎn)List鲤看,List再轉(zhuǎn)Set的過程中消耗了大量的性能。我們可以優(yōu)化成如下形式:

或者耍群,進一步優(yōu)化成如下所示最高效的代碼:

3. 在迭代時移除List中的元素

首先义桂,看一下在迭代過程中移除List中元素的代碼:

這個示例代碼的輸出結(jié)果是:

這個示例代碼中存在一個非常嚴重的錯誤。當一個元素被移除時蹈垢,該List的大小(size)就會縮減慷吊,同時也改變了索引的指向。所以曹抬,在迭代的過程中使用索引溉瓶,將無法從List中正確地刪除多個指定的元素。

你可能知道解決這個錯誤的方式之一是使用迭代器(iterator)。而且堰酿,你可能認為Java中的foreach語句與迭代器(iterator)是非常相似的疾宏,但實際情況并不是這樣。我們考慮一下如下的示例代碼:

這個示例代碼會拋出來一個ConcurrentModificationException触创。我們應該修改成如下所示:

next()方法必須在remove()方法之前被調(diào)用坎藐。在 foreach循環(huán)中,編譯器使得 remove()方法先于next()方法被調(diào)用哼绑,這就導致了ConcurrentModificationException 異常岩馍。具體細節(jié)可以查看ArrayList.iterator()的源碼拆讯。

4. Hashtable vs HashMap

學習過數(shù)據(jù)結(jié)構(gòu)的讀者都知道一種非常重要的數(shù)據(jù)結(jié)構(gòu)叫做哈希表芯杀。在Java中拔妥,對應哈希表的的類是HashMap而不是Hashtable柱嫌。HashMap與Hashtable之間的最核心區(qū)別就是:

HashMap是非同步的瘦赫,Hashtable是同步的甸鸟。

5. 在Collection中使用原始類型

在Java中第队,很容易把原始類型與無限通配類型混淆谦疾。我們舉個Set相關(guān)的例子:Set就是原始類型励稳;Set就是無限通配類型佃乘。我們看一個使用在List中使用原始類型的例子:

這個示例代碼會拋出來一個異常:

在Collection使用原始類型是具有很多的類型錯誤風險的,因為原始類型沒有靜態(tài)類型檢查驹尼。實際上趣避,Set、Set和Set之間具有非常大的差異新翎。

6. 訪問權(quán)限

很多的Java初學者喜歡使用public來修飾類的成員程帕。這樣可以很方便地直接訪問和存取該成員。但是地啰,這是一種非常糟糕的編程風格愁拭,正確的設(shè)計風格應該是盡可能降低類成員的訪問權(quán)限。

7. ArrayList vs LinkedList

很多的Java初學者不明白ArrayList與LinkedList之間的區(qū)別亏吝,所以岭埠,他們完全只用相對簡單的ArrayList,甚至不知道JDK中還存在LinkedList蔚鸥。但是惜论,在某些具體場景下,這兩種List的選擇會導致程序性能的巨大差異止喷。簡單而言:當應用場景中有很多的add/remove操作馆类,只有少量的隨機訪問操作時,應該選擇LinkedList;在其他的場景下弹谁,考慮使用ArrayList乾巧。

8. 可變 vs 不可變

不可變的對象具有非常多的優(yōu)勢技羔,比如簡單,安全等卧抗。但是藤滥,對于每一個不同的值,都需要該類的一個對象社裆。而且拙绊,生成很多對象帶來的問題就是可能導致頻繁的垃圾回收。所以泳秀,在選擇可變類還是不可變類時标沪,應該綜合考慮后再做抉擇。

通常而言嗜傅,可變對象可以避免創(chuàng)建大量的中間對象金句。一個非常經(jīng)典的例子就是鏈接大量的短String對象為一個長的String對象。如果使用不可變String類吕嘀,鏈接的過程將產(chǎn)生大量的违寞,適合立即被垃圾回收的中間String對象,這將消耗大量的CPU性能和內(nèi)存空間偶房。此時趁曼,使用一個可變的StringBuilder或StringBuffer才是正確的。

除了上述情況棕洋,可變對象在其他場景下可能用于不可變對象挡闰。比如,傳遞一個可變的對象到方法內(nèi)部掰盘,利用該對象可以收集多個結(jié)果摄悯,而不用在多個循環(huán)層次中跳進跳出。

9. 繼承中的構(gòu)造函數(shù)

上圖中出現(xiàn)的兩個編譯時錯誤是因為:父類中沒有定義默認構(gòu)造函數(shù)愧捕,而子類中又調(diào)用了父類的默認構(gòu)造函數(shù)奢驯。在Java中,如果一個類不定義任何構(gòu)造函數(shù)晃财,編譯期將自動插入一個默認構(gòu)造函數(shù)到給類中叨橱。一旦一個類定義了任何一個構(gòu)造函數(shù)典蜕,編譯期就不會插入任何構(gòu)造函數(shù)到類中断盛。在上面的示例中,Super類定義了一個參數(shù)類型為String的構(gòu)造函數(shù)愉舔,所以該類中只有一個構(gòu)造函數(shù)钢猛,不會有默認構(gòu)造函數(shù)了。

&emps;在我們的子類 Sub 中轩缤,我們定義了兩個構(gòu)造函數(shù):一個參數(shù)類型為String的構(gòu)造函數(shù)命迈,另一個為午餐的默認函數(shù)贩绕。由于它們都沒有在函數(shù)體的第一行指定調(diào)用父類的哪一個構(gòu)造函數(shù),所以它們都需要調(diào)用父類 Super 的默認構(gòu)造函數(shù)壶愤。但是淑倾,父類 Super 的默認構(gòu)造函數(shù)是不存在的,所以編譯器報告了這兩個錯誤信息征椒。

10. 字符串對象的兩個構(gòu)建方式

Java中的字符串對象具有兩個常見的創(chuàng)建方式:

它們之間的區(qū)別是什么呢娇哆?我們再看一下如下的代碼:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市勃救,隨后出現(xiàn)的幾起案子碍讨,更是在濱河造成了極大的恐慌,老刑警劉巖蒙秒,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勃黍,死亡現(xiàn)場離奇詭異,居然都是意外死亡晕讲,警方通過查閱死者的電腦和手機覆获,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓢省,“玉大人锻梳,你說我怎么就攤上這事【煌保” “怎么了疑枯?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛔六。 經(jīng)常有香客問我荆永,道長,這世上最難降的妖魔是什么国章? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任具钥,我火速辦了婚禮,結(jié)果婚禮上液兽,老公的妹妹穿的比我還像新娘骂删。我一直安慰自己,他們只是感情好四啰,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布宁玫。 她就那樣靜靜地躺著,像睡著了一般柑晒。 火紅的嫁衣襯著肌膚如雪欧瘪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天匙赞,我揣著相機與錄音佛掖,去河邊找鬼妖碉。 笑死,一個胖子當著我的面吹牛芥被,可吹牛的內(nèi)容都是我干的欧宜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拴魄,長吁一口氣:“原來是場噩夢啊……” “哼鱼鸠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起羹铅,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚀狰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后职员,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體麻蹋,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年焊切,在試婚紗的時候發(fā)現(xiàn)自己被綠了扮授。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡专肪,死狀恐怖刹勃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嚎尤,我是刑警寧澤荔仁,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站芽死,受9級特大地震影響乏梁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜关贵,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一遇骑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揖曾,春花似錦落萎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至念祭,卻和暖如春兑宇,著一層夾襖步出監(jiān)牢的瞬間碍侦,已是汗流浹背粱坤。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工隶糕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人站玄。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓枚驻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親株旷。 傳聞我的和親對象是個殘疾皇子再登,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 人非圣賢,孰能無過晾剖。都說Java語言是一門簡單的編程語言锉矢,基于C++演化而來,剔除了很多C++中的復雜特性齿尽,但這并...
    小宇java閱讀 215評論 0 1
  • 幸福密碼 人人追求幸福沽损,往往以成功作為階梯。然而滿足者少之又少循头,殊不知绵估,幸福是一種能力,且與...
    會游泳的鸚鵡閱讀 237評論 0 0
  • 回到蕪湖卡骂,公婆忙著晚飯国裳。 魚缸注水口的水柱因著重力和流速沖破水面形成一個漩,大大小小的水泡圍著這個漩打轉(zhuǎn)全跨。待到力量...
    天一生水L閱讀 190評論 0 0
  • 最近單位在辦理入外省網(wǎng)上平臺登記浓若,中途領(lǐng)導讓我參與負責網(wǎng)上錄入的內(nèi)容盒使。因此,讓同事直接將鏈接發(fā)給我七嫌,為了快速做好這...
    一米Sunny閱讀 219評論 0 0
  • 一月 人生中第一次經(jīng)歷考研少办,沒有忘記考完最后一科走出考場時的沮喪,QQ的狀態(tài)改為了“希望明年的此時可以自信從容的走...
    尋歡大盜閱讀 157評論 0 1