中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java開發者容易犯的十個錯誤是什么

發布時間:2022-01-05 14:36:02 來源:億速云 閱讀:76 作者:iii 欄目:大數據

這篇文章主要講解了“Java開發者容易犯的十個錯誤是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java開發者容易犯的十個錯誤是什么”吧!

Top1. 數組轉換為數組列表

將數組轉換為數組列表,開發者經常會這樣做:

[java]  
List<String> list = Arrays.asList(arr);

Arrays.asList()將返回一個數組內部是私有靜態類的ArrayList,這不是java.util.ArrayList類,java.util.Arrays.ArrayList類有set()、 get()、 contains()方法,但是沒有任何加元素的方法,因此它的大小是固定的。可以用于方便轉換list,不能添加新元素,所以選擇正確的使用場景。

你也可以這么做來創建一個真正的數組:

[java]  
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));

ArrayList的構造函數能夠接受一個集合類型,這也是java.util.Arrays.ArrayList的超級類型。

Top2. 檢查一個數組包含一個值

開發者經常這么做:

[java]  
Set<String> set = new HashSet<String>(Arrays.asList(arr));  
return set.contains(targetValue);

代碼可以工作,但是沒有必要首先轉換列表到Set,轉換一個列表到一個Set需要額外的時間。因此你可以把它簡化為:

[java]  
Arrays.asList(arr).contains(targetValue);

[java]  
for(String s: arr){  
if(s.equals(targetValue))  
return true;  
}  
return false;

第一個比第二個更具可讀性

Top3. 在一個循環中從一個列表里刪除一個元素

考慮下面刪除元素的代碼在迭代中的結果:

[java]  
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);

輸出是:

[java]  
[b, d]

該方法有一個嚴重的問題,當一個元素被刪除時,列表收縮的大小以及指針改變了。所以想要在循環內利用指針刪除多個元素是無法正常進行的。

這種情況下使用迭代器才是正確的方法,foreach循環在Java中的工作像是一個迭代器,但實際上并不是,考慮下面的代碼:

[java]  
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));  
 
for (String s : list) {  
if (s.equals("a"))  
list.remove(s);  
}

它會報出ConcurrentModificationException異常。

相反下面這個就可以正常工作。

[java]  
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()的源代碼。

Top4. Hashtable vs HashMap

根據算法的常規,Hashtable是對數據結構的稱呼。但是在Java中,數據結構的名稱是HashMap。Hashtable和HashMap關鍵不同之一是Hashtable是同步的。

Top5. 使用集合的原始類型

在Java中,原始類型和無限制的通配符類型很容易被混淆。以Set為例,Set是原始類型,而Set(?)則是無限制的通配符類型。

考慮下面的代碼,以一個原始類型List作為參數:

[java]  
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);  
}

該代碼會拋出一個異常:

[java]  
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String  
at ...

使用原始類型集合是危險的,因為原始類型集合跳過了泛型類型檢查,也不安全。Set、Set<?>和Set<Object>之間有很大的不同。

Top6. 訪問級別

開發者經常對類域使用public,這很容易通過直接引用獲得域值,但這是一個非常糟糕的設計。根據經驗來說是給予成員的訪問級別越低越好。

詳細情況可點擊查看Java中成員訪問級別(請點擊“閱讀原文”查看):public、protected、private

Top7.ArrayList VS LinkedList

如果你不知道ArrayList和LinkedList之間的區別時,你可能會經常的選用ArrayList,因為它看起來看熟悉。然而它們之間有巨大的性能不同。簡單的來說,如果有大量的添加/刪除操作,并且沒有很多的隨機存取操作時,LinkedList應該是你的首選。如果您對此不是很了解的話,點此此處查看更多關于它們性能的信息。

Top8. Mutable VS Immutable

Immutable對象有很多優勢,比如簡單、安全等等。但它要求每一個不同的值都需要有一個不同的對象,而太多的對象可能會導致垃圾收集的高成本。所以對Mutable和Immutable的選擇應該有一個平衡點。

一般來說,Mutable對象用于避免產生過多的中間對象,經典的例子是連接大量的字符串數。如果你使用Immutable字符串,那么會產生很多符合垃圾收集條件的對象。這對CPU是浪費時間和精力的,當其可以使用Mutable對象作為正確的解決方案。(如StringBuilder)

[java]  
String result="";  
for(String s: arr){  
result = result + s;  
}

這里還有一些其他Mutable對象可取的情況。例如mutable對象傳遞到方法中允許你在不跳過太多語法的情況下收集多個結果。另一個例子是排序和過濾,你可以構建一個帶有原有集合的方法,并返回一個已排序的,不過這對大的集合來說會造成更大的浪費。

Top9. Super和Sub構造函數

Java開發者容易犯的十個錯誤是什么

這個編譯錯誤是因為默認的Super構造函數是未定義的。在Java中,如果一個類沒有定義一個構造函數,編譯器會默認的為類插入一個無參數構造函數。如果一個構造函數是在Super類中定義的,這種情況下Super(String s),編譯器不會插入默認的無參數構造函數。

另一方面,Sub類的構造函數,無論帶不帶有參數,都會調用無參數的Super構造函數。

編譯器在Sub類中試圖將Super()插入到兩個構造函數中,但是Super默認的構造函數是沒有定義的,編譯器才會報錯。如何解決這一問題?你只需在Super類中添加一個Super()構造函數,如下所示:

[java]  
public Super(){  
System.out.println("Super");  
}

或移除自定義的Super構造函數,又或者在Sub函數中添加super(value)。

Top10. ""或構造函數?

字符串可以通過兩種方式創建:

[java]  
//1. use double quotes  
String x = "abc";  
//2. use constructor  
String y = new String("abc");

它們之間有何不同?下面的例子可以給出答案:

[java]  
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開發者容易犯的十個錯誤是什么”的內容了,經過本文的學習后,相信大家對Java開發者容易犯的十個錯誤是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

岱山县| 南皮县| 大余县| 常宁市| 上犹县| 兰考县| 抚顺县| 民勤县| 盘山县| 苍溪县| 鄂尔多斯市| 长岛县| 井研县| 太谷县| 武陟县| 四会市| 岐山县| 泾川县| 女性| 高阳县| 石台县| 河南省| 永兴县| 库车县| 体育| 铜山县| 和顺县| 海安县| 兴安盟| 锡林郭勒盟| 巴彦县| 华安县| 大方县| 嘉黎县| 永丰县| 类乌齐县| 本溪| 东兴市| 尼玛县| 额济纳旗| 大渡口区|