Java程式設計師容易犯的10個錯誤
1. Array 轉 ArrayList
一般開發者喜歡用:
List<String> list = Arrays.asList(arr);
Arrays.asList() 會返回一個ArrayList,這是Arrays裡內嵌的一個私有靜態類,而並不是java.util.ArrayList類java.util.Arrays.ArrayList 有set(), get(), contains()方法,但並支援新增元素,所以大小是固定的,想要建立一個真正的ArrayList,你應該:
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));
關於這個方法更多的解釋,請參見我之前的一篇文章
2.檢測一個Array是否包含一個元素
一般開發者喜歡用:
Set<String> set = new HashSet<String>(Arrays.asList(arr)); return set.contains(targetValue);
這段程式碼能夠工作,但並沒有先轉將list轉為set,list轉為set需要額外時間,可以用下面更簡單的:
Arrays.asList(arr).contains(targetValue);
或者
for(String s: arr){ if(s.equals(targetValue)) return true; } return false;
第一種方法比第二種的可讀性更好。
3. 在一個迴圈中移除list中的元素
考慮下下面這種方法:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); for (int i = 0; i < list.size(); i++) { list.remove(i); } System.out.println(list);
期望輸出是 [b, d]
但這種方法有一個嚴重的問題,當一個元素被移除的時候,list的大小就縮減了,索引也發生了改變。所以如果想要在一個迴圈中使用索引移除多個元素,這是不可行的。
或許你又想用迭代器的方式解決這個問題,但實際上也不可行,考慮下下面的程式碼:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); for (String s : list) { if (s.equals("a")) list.remove(s); }
會報錯 ConcurrentModificationException.
正確的應該是:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); Iterator<String> iter = list.iterator(); while (iter.hasNext()) { String s = iter.next(); if (s.equals("a")) { iter.remove(); } }
4. Hashtable vs HashMap
在演算法中,雜湊表是資料結構的名稱。但在Java中,資料結構的名字是HashMap中。其中一個Hashtable和HashMap的之間的主要區別是,Hashtable是同步的。所以,很多時候,你並不需要雜湊表,HashMap就夠用了。
5.使用原始型別的集合
在Java中,原始型別和無界萬用字元型別很容易混在一起。以Set為例,設定為原始型別,同時set<?>是無界的萬用字元型別。
使用原始型別list,考慮下面的情況:
public static void add(List list, Object o){ list.add(o); } public static void main(String[] args){ List<String> list = new ArrayList<String>(); add(list, 10); String s = list.get(0); }
這個程式碼將會丟擲錯誤:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at ...
使用原始型別集合是很危險的一件事,因為它跳過了類屬性檢測並且是不安全的。Set, Set<?>, and Set
6.訪問許可權
很多開發者使用public修飾類的欄位,這樣很容易獲取欄位值,但這是一個糟糕的設計。經驗法則是給使用者儘可能低的訪問許可權。
7.ArrayList vs. LinkedList
大部分的開發者並不知道ArrayList和LinkedList 的區別,所以經常使用ArrayList,這個看起來更熟悉。但是,在這兩者之間,有一個很大的效能差異。
簡單來說,在有很多插入和刪除操作時,同時有很少或者幾乎沒有隨機訪問的操作情況下,推薦使用LinkedList。其次,再使用ArrayList。
8.Mutable vs. Immutable(可變 VS 不可變)
不可變物件有很多優勢這樣簡單,安全,等等。但它對於每一個不同的變數,需要一個單獨的物件。太多的物件可能會導致高成本的垃圾收集。所以在選擇可變和不可變的時應該有個權衡。
一般來說,使用可變物件,以避免產生過多的中間物件。一個經典的例子就是連線大量的字串。如果使用不可變的String,你會產生很多立馬要被垃圾收集回收的物件,這很消耗時間和精力。如果使用一個不可變的,類似StringBuffer。
String result=""; for(String s: arr){ result = result + s; }
可變物件還有其他的例子:函式傳參的過程中,可以傳入可變物件,這樣可以得到多個結果。
9.父類和子類的構建
編譯出錯的原因主要是預設的Super類的建構函式並沒有被定義。在Java中,如果一個類沒有實現建構函式,編譯器預設會給這個類插入一個無參建構函式。如果在父類中已經有了建構函式,那麼編譯器將不會再插入預設無參建構函式。
子類的建構函式,要麼是帶參的要麼是無參的,都會呼叫父類的無參構造。因為編譯器想在子類中,加入super(),但是父類的無參建構函式並不存在。所以,編譯器會報錯。
為了解決這個問題,有兩種解決辦法,第一,在Super類中,加入無參構造:
public Super(){ System.out.println("Super"); }
第二種方式,移除自定義的父類建構函式
第三種方式,子類的建構函式中加入super(value)
10.”" or Constructor?
建立一個String 有兩種方式:
//1. use double quotes String x = "abc"; //2. use constructor String y = new String("abc");
區別是什麼?
String a = "abcd"; String b = "abcd"; System.out.println(a == b); // True System.out.println(a.equals(b)); // True String c = new String("abcd"); String d = new String("abcd"); System.out.println(c == d); // False System.out.println(c.equals(d)); // True
相關文章
- Java 開發者最容易犯的10個錯誤Java
- 程式設計師最容易犯的幾個技術上的錯誤程式設計師
- 每個程式設計師都會犯的10個錯誤程式設計師
- C# 程式設計師易犯的 10 個錯誤C#程式設計師
- 每個程式設計師都可能犯過的10個錯誤程式設計師
- C++程式設計人員容易犯的10個C#錯誤(轉)C++程式設計C#
- Android程式設計容易犯的錯誤之一Android程式設計
- Android程式設計容易犯的錯誤之二Android程式設計
- Java初學者容易犯的程式碼錯誤Java
- Java程式設計師可能犯的3個常見SQL錯誤Java程式設計師SQL
- 程式設計師程式設計生涯中會犯的7個錯誤程式設計師
- 十個Python程式設計師易犯的錯誤Python程式設計師
- 10個最容易犯的HTML標籤錯誤HTML
- 有哪些錯是Java程式設計師在面試中最容易犯的呢?Java程式設計師面試
- Java程式設計師常犯的10個錯誤Java程式設計師
- Java初學者容易犯哪些錯誤?Java
- 程式設計師可能犯的3個常見SQL錯誤程式設計師SQL
- macOS小白容易犯的24個錯誤Mac
- go新手容易犯的三個致命錯誤Go
- 十個PHP開發者最容易犯的錯誤PHP
- Linux 新手容易犯的 7 個錯誤Linux
- Linux 新手容易犯的 7 個 錯誤Linux
- Logo設計師可能會犯的22個錯誤Go
- 機器學習入門階段程式設計師易犯的5個錯誤機器學習程式設計師
- 寫Java程式最容易犯的21種錯誤例項分析Java
- Bash程式設計易犯的錯誤程式設計
- Java程式設計師可能會犯的幾個錯誤, 看看你是不是躺槍了?Java程式設計師
- SQL Server 致程式設計師(容易忽略的錯誤)SQLServer程式設計師
- 前端開發最容易犯的13個JavaScript錯誤前端JavaScript
- 程式基本設計可以犯的最大錯誤
- 程式設計師容易忽略的SQL Server錯誤集錦程式設計師SQLServer
- 很多人容易犯的面試錯誤面試
- 當心!程式設計師在職業生涯中最易犯的7個錯誤程式設計師
- 2017年——百度10年Java大神教你避免容易犯的10個錯誤Java
- Java程式設計師在寫SQL程式時候常犯的10個錯誤Java程式設計師SQL
- (網頁)Java程式設計師們最常犯的10個錯誤(轉)網頁Java程式設計師
- 在學程式設計中我犯的2個最大的錯誤程式設計
- JavaScript容易犯錯的九個陷阱JavaScript