Java開發人員常犯的十大錯誤
夥伴們注意了!
小編在這裡給大家送上關注福利:
轉發本文,關注“速學Java”公眾號即可領取小編精心準備的資料一份!
這個列表總結了Java開發人員經常犯的10大錯誤。
1. 將陣列轉換為ArrayList
要將陣列轉換為ArrayList,開發人員通常這樣做:

aslist()將返回一個數組中的私有靜態類ArrayList,它不是java.util。ArrayList類。java.util.Arrays。ArrayList類有set()、get()、contains()方法,但沒有任何用於新增元素的方法,因此它的大小是固定的。要建立一個真正的ArrayList,你應該做:

ArrayList的建構函式可以接受集合型別,這也是java.util. array .ArrayList的超型別。
2. 檢查陣列是否包含值
開發人員常常做的事:

該程式碼可以工作,但是不需要先將列表轉換為set。將列表轉換為集合需要額外的時間。它可以簡單到:

或者

第一個比第二個可讀性強。
3.從迴圈中的列表中刪除元素
考慮下面的程式碼,它在迭代過程中刪除元素:

輸出是:

這種方法有一個嚴重的問題。
當刪除一個元素時,列表的大小會縮小,索引也會改變。
因此,如果您想通過使用索引刪除迴圈中的多個元素,這將無法正常工作。
您可能知道使用iterator是刪除迴圈中的元素的正確方法,並且您知道Java中的foreach迴圈像迭代器一樣工作,但實際上它不是。考慮以下程式碼:

它會丟擲ConcurrentModificationException。
相反,以下是可以的:

.next()必須在.remove()之前呼叫。
在foreach迴圈中,編譯器將在刪除導致ConcurrentModificationException異常的元素之後呼叫.next()。
您可能想看看ArrayList.iterator()的原始碼。
4. Hashtable和HashMap
按照演算法中的約定,Hashtable是資料結構的名稱。
但是在Java中,資料結構的名稱是HashMap。
Hashtable和HashMap之間的一個關鍵區別是Hashtable是同步的。
所以通常不需要Hashtable,而應該使用HashMap。
5. 使用原始型別的集合
在Java中,原始型別和無界萬用字元型別很容易混合在一起。
以Set為例,Set是raw型別,Set<?>是無界萬用字元型別。
考慮以下使用原始型別列表作為引數的程式碼:

這段程式碼將丟擲一個異常:

使用原始型別集合是危險的,因為原始型別集合跳過泛型型別檢查,而且不安全。
Set和Set<?之間有很大的區別。>,<物件>。
看看原始型別vs.無界萬用字元和型別擦除。
6. 訪問級別
開發人員經常使用public作為類欄位。
通過直接引用很容易獲得欄位值,但這是一個非常糟糕的設計。
經驗法則是為成員提供儘可能低的訪問級別。
7. ArrayList與LinkedList
當開發人員不知道ArrayList和LinkedList之間的區別時,他們經常使用ArrayList,因為它看起來很熟悉。
然而,它們之間存在著巨大的效能差異。
簡而言之,LinkedList應該是首選的,如果有大量的新增/刪除操作,沒有很多隨機訪問操作。
如果你對ArrayList和LinkedList不熟悉的話,可以檢視它們的效能。
8. 可變和不可變的
不可變物件有許多優點,如簡單性、安全性等。
但是對於每個不同的值,它都需要一個單獨的物件,太多的物件可能會導致垃圾收集的高成本。
在可變和不可變之間進行選擇時,應該有一個平衡。
通常,可變物件用於避免產生過多的中間物件。
一個典型的例子是連線大量字串。
如果使用不可變字串,就會立即生成許多符合垃圾收集條件的物件。
這浪費了CPU上的時間和精力,使用了一個可變的物件和正確的解決方案(例如StringBuilder)。

還有一些情況需要可變物件。
例如,將可變物件傳遞到方法中可以讓您收集多個結果,而不需要跨越太多的語法障礙。
另一個例子是排序和過濾:當然,您可以使用一個方法來獲取原始集合,並返回一個排序後的集合,但是對於較大的集合來說,這將是非常浪費的。
(摘自dasblinkenlight關於堆疊溢位的回答)
9. 父和子的建構函式

發生此編譯錯誤是因為預設的超級建構函式未定義。
在Java中,如果一個類沒有定義建構函式,編譯器將預設為該類插入一個預設的無引數建構函式。
如果建構函式是在Super類中定義的,在本例中是Super(String s),編譯器將不會插入預設的無引數建構函式。
這是上面的超類的情況。
子類的建構函式,無論是帶引數的還是無引數的,都將呼叫無引數的超級建構函式。
因為編譯器試圖將super()插入到子類中的2個建構函式中,但是沒有定義super的預設建構函式,所以編譯器報告錯誤訊息。
要解決這個問題,只需1)將Super()建構函式新增到超類like中,或者2)刪除自定義的超級建構函式,或者3)將Super(value)新增到子建構函式中。

10. ”“或者建構函式?
字串可以通過兩種方式建立:

差異是什麼
下面的例子可以提供一個快速的答案:
