這篇文章主要講解了“Java開發(fā)者容易犯的十個錯誤是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習“Java開發(fā)者容易犯的十個錯誤是什么”吧!
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、陜州網(wǎng)絡(luò)推廣、微信平臺小程序開發(fā)、陜州網(wǎng)絡(luò)營銷、陜州企業(yè)策劃、陜州品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供陜州建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com
Top1. 數(shù)組轉(zhuǎn)換為數(shù)組列表
將數(shù)組轉(zhuǎn)換為數(shù)組列表,開發(fā)者經(jīng)常會這樣做:
[java]
Listlist = Arrays.asList(arr);
Arrays.asList()將返回一個數(shù)組內(nèi)部是私有靜態(tài)類的ArrayList,這不是java.util.ArrayList類,java.util.Arrays.ArrayList類有set()、 get()、 contains()方法,但是沒有任何加元素的方法,因此它的大小是固定的??梢杂糜诜奖戕D(zhuǎn)換list,不能添加新元素,所以選擇正確的使用場景。
你也可以這么做來創(chuàng)建一個真正的數(shù)組:
[java]
ArrayListarrayList = new ArrayList (Arrays.asList(arr));
ArrayList的構(gòu)造函數(shù)能夠接受一個集合類型,這也是java.util.Arrays.ArrayList的超級類型。
Top2. 檢查一個數(shù)組包含一個值
開發(fā)者經(jīng)常這么做:
[java]
Setset = new HashSet (Arrays.asList(arr));
return set.contains(targetValue);
代碼可以工作,但是沒有必要首先轉(zhuǎn)換列表到Set,轉(zhuǎn)換一個列表到一個Set需要額外的時間。因此你可以把它簡化為:
[java]
Arrays.asList(arr).contains(targetValue);
或
[java]
for(String s: arr){
if(s.equals(targetValue))
return true;
}
return false;
第一個比第二個更具可讀性
Top3. 在一個循環(huán)中從一個列表里刪除一個元素
考慮下面刪除元素的代碼在迭代中的結(jié)果:
[java]
ArrayListlist = new ArrayList (Arrays.asList("a", "b", "c", "d"));
for (int i = 0; i < list.size(); i++) {
list.remove(i);
}
System.out.println(list);
輸出是:
[java]
[b, d]
該方法有一個嚴重的問題,當一個元素被刪除時,列表收縮的大小以及指針改變了。所以想要在循環(huán)內(nèi)利用指針刪除多個元素是無法正常進行的。
這種情況下使用迭代器才是正確的方法,foreach循環(huán)在Java中的工作像是一個迭代器,但實際上并不是,考慮下面的代碼:
[java]
ArrayListlist = new ArrayList (Arrays.asList("a", "b", "c", "d"));
for (String s : list) {
if (s.equals("a"))
list.remove(s);
}
它會報出ConcurrentModificationException異常。
相反下面這個就可以正常工作。
[java]
ArrayListlist = new ArrayList (Arrays.asList("a", "b", "c", "d"));
Iteratoriter = list.iterator();
while (iter.hasNext()) {
String s = iter.next();
if (s.equals("a")) {
iter.remove();
}
}
.next()必須在.remove()之前被調(diào)用。在foreach循環(huán)中,編譯器將在刪除元素操作之后調(diào)用.next(),這也是導(dǎo)致ConcurrentModificationException異常的原因,你可以點擊此處查看ArrayList.iterator()的源代碼。
Top4. Hashtable vs HashMap
根據(jù)算法的常規(guī),Hashtable是對數(shù)據(jù)結(jié)構(gòu)的稱呼。但是在Java中,數(shù)據(jù)結(jié)構(gòu)的名稱是HashMap。Hashtable和HashMap關(guān)鍵不同之一是Hashtable是同步的。
Top5. 使用集合的原始類型
在Java中,原始類型和無限制的通配符類型很容易被混淆。以Set為例,Set是原始類型,而Set(?)則是無限制的通配符類型。
考慮下面的代碼,以一個原始類型List作為參數(shù):
[java]
public static void add(List list, Object o){
list.add(o);
}
public static void main(String[] args){
Listlist = new ArrayList ();
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
Top6. 訪問級別
開發(fā)者經(jīng)常對類域使用public,這很容易通過直接引用獲得域值,但這是一個非常糟糕的設(shè)計。根據(jù)經(jīng)驗來說是給予成員的訪問級別越低越好。
詳細情況可點擊查看Java中成員訪問級別(請點擊“閱讀原文”查看):public、protected、private
Top7.ArrayList VS LinkedList
如果你不知道ArrayList和LinkedList之間的區(qū)別時,你可能會經(jīng)常的選用ArrayList,因為它看起來看熟悉。然而它們之間有巨大的性能不同。簡單的來說,如果有大量的添加/刪除操作,并且沒有很多的隨機存取操作時,LinkedList應(yīng)該是你的首選。如果您對此不是很了解的話,點此此處查看更多關(guān)于它們性能的信息。
Top8. Mutable VS Immutable
Immutable對象有很多優(yōu)勢,比如簡單、安全等等。但它要求每一個不同的值都需要有一個不同的對象,而太多的對象可能會導(dǎo)致垃圾收集的高成本。所以對Mutable和Immutable的選擇應(yīng)該有一個平衡點。
一般來說,Mutable對象用于避免產(chǎn)生過多的中間對象,經(jīng)典的例子是連接大量的字符串數(shù)。如果你使用Immutable字符串,那么會產(chǎn)生很多符合垃圾收集條件的對象。這對CPU是浪費時間和精力的,當其可以使用Mutable對象作為正確的解決方案。(如StringBuilder)
[java]
String result="";
for(String s: arr){
result = result + s;
}
這里還有一些其他Mutable對象可取的情況。例如mutable對象傳遞到方法中允許你在不跳過太多語法的情況下收集多個結(jié)果。另一個例子是排序和過濾,你可以構(gòu)建一個帶有原有集合的方法,并返回一個已排序的,不過這對大的集合來說會造成更大的浪費。
Top9. Super和Sub構(gòu)造函數(shù)
這個編譯錯誤是因為默認的Super構(gòu)造函數(shù)是未定義的。在Java中,如果一個類沒有定義一個構(gòu)造函數(shù),編譯器會默認的為類插入一個無參數(shù)構(gòu)造函數(shù)。如果一個構(gòu)造函數(shù)是在Super類中定義的,這種情況下Super(String s),編譯器不會插入默認的無參數(shù)構(gòu)造函數(shù)。
另一方面,Sub類的構(gòu)造函數(shù),無論帶不帶有參數(shù),都會調(diào)用無參數(shù)的Super構(gòu)造函數(shù)。
編譯器在Sub類中試圖將Super()插入到兩個構(gòu)造函數(shù)中,但是Super默認的構(gòu)造函數(shù)是沒有定義的,編譯器才會報錯。如何解決這一問題?你只需在Super類中添加一個Super()構(gòu)造函數(shù),如下所示:
[java]
public Super(){
System.out.println("Super");
}
或移除自定義的Super構(gòu)造函數(shù),又或者在Sub函數(shù)中添加super(value)。
Top10. ""或構(gòu)造函數(shù)?
字符串可以通過兩種方式創(chuàng)建:
[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開發(fā)者容易犯的十個錯誤是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習后,相信大家對Java開發(fā)者容易犯的十個錯誤是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!