這個列表總結了Java開發人員經常犯的十大錯誤。
1.將Array轉換為ArrayList
若要將數組轉換為ArrayList
開發人員經常這樣做:
List<String> list = Arrays.asList(arr);
java里parse方法、Arrays.asList()
將返回ArrayList
中的私有靜態類。Arrays
,這不是java.util.ArrayList
班級,等級。這個java.util.Arrays.ArrayList
類set()
,get()
,contains()
方法,但沒有任何添加元素的方法,因此其大小是固定的。創造一個真實的ArrayList
,你應該做:
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));
的構造者ArrayList
可以接受集合類型,這也是java.util.Arrays.ArrayList
.
#2.檢查Array是否包含一個值
開發人員經常這樣做:
Set<String> set = new HashSet<String>(Arrays.asList(arr));
return set.contains(targetValue);
java安裝不了?代碼可以工作,但不需要將列表轉換為先設置。將列表轉換為集合需要額外的時間。它可以簡單到:
Arrays.asList(arr).contains(targetValue);
或
for(String s: arr){if(s.equals(targetValue))return true;
}
return false;
第一個比第二個更易讀。
#3.從循環中的列表中刪除元素
java substring、考慮以下代碼,它在迭代期間刪除元素:
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]
這種方法存在一個嚴重的問題。刪除元素時,列表的大小會縮小,索引也會發生變化。因此,如果要通過使用索引刪除循環中的多個元素,這將無法正常工作。
您可能知道使用迭代器是刪除循環中元素的正確方法,而且您知道在Java中foreach循環的工作方式類似于迭代器,但實際上并非如此。考慮以下代碼:
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));for (String s : list) {if (s.equals("a"))list.remove(s);
}
Java安裝錯誤、它會被扔出去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();}
}
.next()
必須在此之前調用.remove()
..在foreach循環中,編譯器將使.next()
在移除元素操作后調用,這將導致ConcurrentModificationException
..您可能想看看ArrayList.iterator().
#4.Hashtable與HashMap
java報錯、根據算法中的約定,Hashtable是數據結構的名稱。但是在Java中,數據結構的名稱是HashMap
..其中一個關鍵的區別是Hashtable
和HashMap
那是Hashtable
是同步的。所以很多時候你不需要Hashtable
,相反HashMap
應該用。
HashMap與Treemap vs Hashtable與LinkedHashMap
#5使用原料類型的收藏
在爪哇,原始類型和無界通配符類型很容易混合在一起。舉個例子,Set
是原始類型,而Set<?>
是無界通配符類型。
java錯誤。考慮使用原始類型的下列代碼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<?>
,和Set<Object>
..檢查
原始類型與無界通配符和類型擦除.
java?#6.訪問級別
開發人員經常在類字段中使用public。通過直接引用可以很容易地獲得字段值,但這是一個非常糟糕的設計。經驗法則是為成員提供盡可能低的訪問級別。
公共、默認、受保護和私有的
#7.ArrayList訴LinkedList
java中的contains。當開發人員不知道ArrayList
和LinkedList
,他們經常使用ArrayList
因為它看起來很眼熟。然而,它們之間存在著巨大的性能差異。總之,LinkedList
如果有大量的添加/刪除操作,并且沒有很多隨機訪問操作,則應優先考慮。檢查ArrayListv.V.LinkedList來獲得更多關于他們的表現的信息,如果這對你來說是新的話。
#8.可變與不可變
不可變對象具有許多優點,如簡單性、安全性等。但是它需要為每個不同的值單獨設置一個對象,過多的對象可能會導致垃圾收集的成本過高。在可變和不可變之間應該有一個平衡。
通常,可變對象用于避免產生過多的中間對象。一個典型的例子是連接大量的字符串。如果使用不可變字符串,則會立即生成許多符合垃圾回收條件的對象。這浪費了CPU的時間和精力,使用了一個可變的對象-正確的解決方案。StringBuilder
).
String result="";
for(String s: arr){result = result + s;
}
javalistcontains,在其他情況下,可變對象是可取的。例如,將可變對象傳遞到方法中,可以收集多個結果,而不需要跳過太多的語法圈。另一個例子是排序和過濾:當然,您可以創建一個獲取原始集合并返回排序集合的方法,但是對于較大的集合來說,這將變得非常浪費。(來自達斯賓肯萊的回答關于堆棧溢出)
#9.SuperandSub的構造函數
發生此編譯錯誤是因為默認超級構造函數未定義。在Java中,如果類沒有定義構造函數,編譯器將在默認情況下為類插入默認的無參數構造函數。如果在Superclass中定義了構造函數,在本例中是Super(String S),編譯器將不會插入默認的無參數構造函數。以上是超級班的情況。
子類的構造函數,無論是-參數還是非參數,都將調用無參數超級構造函數。由于編譯器試圖將Super()插入到Sub類中的2個構造函數,但是沒有定義Super默認構造函數,所以編譯器會報告錯誤消息。
要解決這個問題,只需向Superclass添加一個Super()構造函數,如下所示
public Super(){System.out.println("Super");
}
,或2)刪除自定義的超級構造函數,或3)添加super(value)
給分建筑工人。
#10.“還是建筑工人?
字符串可以通過兩種方式創建:
//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)); // TrueString c = new String("abcd");
String d = new String("abcd");
System.out.println(c == d); // False
System.out.println(c.equals(d)); // True
來源:programcreek
作者未知
原文:Top 10 Mistakes Java Developers Make
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态