Java程序員常犯的幾大錯誤

1.ArrayList與LinkedList

當開發人員不知道之間的區別ArrayList和LinkedList他們經常使用ArrayList,因爲它看起來很熟悉。但是,它們之間存在巨大的性能差異。LinkedList如果存在大量的添加/刪除操作並且沒有大量的隨機訪問操作,則應該首選。

2.可變與不可變

不可變對象具有諸如簡單性,安全性等諸多優點。但是,它需要爲每個不同的值分別創建一個對象,並且過多的對象可能會導致垃圾收集的高成本。在可變和不可變之間進行選擇時應該有一個平衡。

通常,可變對象用於避免產生太多中間對象。一個典型的例子是連接大量的字符串。如果你使用一個不可變的字符串,你會產生很多對象,這些對象可以立即進行垃圾回收。這浪費了時間和精力在CPU上,使用可變對象的正確解決方案(例如StringBuilder)。

小編是一個有着5年工作經驗的java程序員,對於java,自己有做資料的整合,一個完整學習java的路線,學習資料和工具,相信這裏有很多學習java的小夥伴,我創立了一個2000人學習扣羣,479121291。每晚都有java的直播課程。無論是初級還是進階的小夥伴小編我都歡迎!

3.Super和Sub的構造函數

在Java中,如果一個類沒有定義構造函數,編譯器默認會爲該類插入一個默認的無參構造函數。如果在Super類中定義了一個構造函數,在這種情況下,Super(String s),編譯器不會插入默認的無參數構造函數。這是上面超級類的情況。

Sub類的構造函數(帶有-argument或no-argument)將調用無參數的Super構造函數。由於編譯器試圖向Sub類中的2個構造函數中插入super,但Super的默認構造函數未定義,因此編譯器會報告錯誤消息。

要解決這個問題,只需要1)添加一個Super構造函數給Super類

4.使用原始類型的集合

在Java中,原始類型和無界通配符類型很容易混合在一起。以Set爲例,Set是原始類型,Set而是無界通配符類型。

考慮使用原始類型List作爲參數的以下代碼:

這段代碼會拋出一個異常,使用原始類型集合是危險的,因爲原始類型集合跳過了泛型類型檢查並且不安全。

5.檢查數組是否包含值

開發人員經常這樣做:

代碼有效,但不需要先將列表轉換爲首先設置。將列表轉換爲集合需要額外的時間。它可以像下面這樣簡單:Arrays.asList(arr).contains(targetValue);

要麼:

6.從循環內的列表中刪除元素

下面的代碼在迭代過程中刪除元素:

這種方法存在嚴重的問題。當一個元素被刪除時,列表的大小會縮小,並且索引也會改變。所以,如果你想通過使用索引刪除循環內的多個元素,那將無法正常工作。

您可能知道使用迭代器是刪除循環內部元素的正確方法,並且您知道Java中的foreach循環像迭代器一樣工作,但事實上並非如此。考慮下面的代碼:

它會拋出ConcurrentModificationException。

相反,以下是確定的:

.next必須在之前被調用.remove。在foreach循環中,編譯器會.next在刪除元素的操作之後調用該函數,從而導致該操作ConcurrentModificationException。你可能想看看ArrayList.iterator的源代碼。

好啦今天的學習文章就到這裏了喜歡關注一下吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章