Java開(kāi)發(fā)者容易犯的十個(gè)錯(cuò)誤是什么

這篇文章主要講解了“Java開(kāi)發(fā)者容易犯的十個(gè)錯(cuò)誤是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java開(kāi)發(fā)者容易犯的十個(gè)錯(cuò)誤是什么”吧!

成都創(chuàng)新互聯(lián)公司專(zhuān)注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、陜州網(wǎng)絡(luò)推廣、微信平臺(tái)小程序開(kāi)發(fā)、陜州網(wǎng)絡(luò)營(yíng)銷(xiāo)、陜州企業(yè)策劃、陜州品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供陜州建站搭建服務(wù),24小時(shí)服務(wù)熱線:18982081108,官方網(wǎng)址:bm7419.com

Top1. 數(shù)組轉(zhuǎn)換為數(shù)組列表

將數(shù)組轉(zhuǎn)換為數(shù)組列表,開(kāi)發(fā)者經(jīng)常會(huì)這樣做:

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

Arrays.asList()將返回一個(gè)數(shù)組內(nèi)部是私有靜態(tài)類(lèi)的ArrayList,這不是java.util.ArrayList類(lèi),java.util.Arrays.ArrayList類(lèi)有set()、 get()、 contains()方法,但是沒(méi)有任何加元素的方法,因此它的大小是固定的??梢杂糜诜奖戕D(zhuǎn)換list,不能添加新元素,所以選擇正確的使用場(chǎng)景。

你也可以這么做來(lái)創(chuàng)建一個(gè)真正的數(shù)組:

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

ArrayList的構(gòu)造函數(shù)能夠接受一個(gè)集合類(lèi)型,這也是java.util.Arrays.ArrayList的超級(jí)類(lèi)型。

Top2. 檢查一個(gè)數(shù)組包含一個(gè)值

開(kāi)發(fā)者經(jīng)常這么做:

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

代碼可以工作,但是沒(méi)有必要首先轉(zhuǎn)換列表到Set,轉(zhuǎn)換一個(gè)列表到一個(gè)Set需要額外的時(shí)間。因此你可以把它簡(jiǎn)化為:

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

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

第一個(gè)比第二個(gè)更具可讀性

Top3. 在一個(gè)循環(huán)中從一個(gè)列表里刪除一個(gè)元素

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

[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]

該方法有一個(gè)嚴(yán)重的問(wèn)題,當(dāng)一個(gè)元素被刪除時(shí),列表收縮的大小以及指針改變了。所以想要在循環(huán)內(nèi)利用指針刪除多個(gè)元素是無(wú)法正常進(jìn)行的。

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

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

它會(huì)報(bào)出ConcurrentModificationException異常。

相反下面這個(gè)就可以正常工作。

[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()之前被調(diào)用。在foreach循環(huán)中,編譯器將在刪除元素操作之后調(diào)用.next(),這也是導(dǎo)致ConcurrentModificationException異常的原因,你可以點(diǎn)擊此處查看ArrayList.iterator()的源代碼。

Top4. Hashtable vs HashMap

根據(jù)算法的常規(guī),Hashtable是對(duì)數(shù)據(jù)結(jié)構(gòu)的稱(chēng)呼。但是在Java中,數(shù)據(jù)結(jié)構(gòu)的名稱(chēng)是HashMap。Hashtable和HashMap關(guān)鍵不同之一是Hashtable是同步的。

Top5. 使用集合的原始類(lèi)型

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

考慮下面的代碼,以一個(gè)原始類(lèi)型List作為參數(shù):

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

該代碼會(huì)拋出一個(gè)異常:

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

使用原始類(lèi)型集合是危險(xiǎn)的,因?yàn)樵碱?lèi)型集合跳過(guò)了泛型類(lèi)型檢查,也不安全。Set、Set<?>和Set<Object>之間有很大的不同。

Top6. 訪問(wèn)級(jí)別

開(kāi)發(fā)者經(jīng)常對(duì)類(lèi)域使用public,這很容易通過(guò)直接引用獲得域值,但這是一個(gè)非常糟糕的設(shè)計(jì)。根據(jù)經(jīng)驗(yàn)來(lái)說(shuō)是給予成員的訪問(wèn)級(jí)別越低越好。

詳細(xì)情況可點(diǎn)擊查看Java中成員訪問(wèn)級(jí)別(請(qǐng)點(diǎn)擊“閱讀原文”查看):public、protected、private

Top7.ArrayList VS LinkedList

如果你不知道ArrayList和LinkedList之間的區(qū)別時(shí),你可能會(huì)經(jīng)常的選用ArrayList,因?yàn)樗雌饋?lái)看熟悉。然而它們之間有巨大的性能不同。簡(jiǎn)單的來(lái)說(shuō),如果有大量的添加/刪除操作,并且沒(méi)有很多的隨機(jī)存取操作時(shí),LinkedList應(yīng)該是你的首選。如果您對(duì)此不是很了解的話,點(diǎn)此此處查看更多關(guān)于它們性能的信息。

Top8. Mutable VS Immutable

Immutable對(duì)象有很多優(yōu)勢(shì),比如簡(jiǎn)單、安全等等。但它要求每一個(gè)不同的值都需要有一個(gè)不同的對(duì)象,而太多的對(duì)象可能會(huì)導(dǎo)致垃圾收集的高成本。所以對(duì)Mutable和Immutable的選擇應(yīng)該有一個(gè)平衡點(diǎn)。

一般來(lái)說(shuō),Mutable對(duì)象用于避免產(chǎn)生過(guò)多的中間對(duì)象,經(jīng)典的例子是連接大量的字符串?dāng)?shù)。如果你使用Immutable字符串,那么會(huì)產(chǎn)生很多符合垃圾收集條件的對(duì)象。這對(duì)CPU是浪費(fèi)時(shí)間和精力的,當(dāng)其可以使用Mutable對(duì)象作為正確的解決方案。(如StringBuilder)

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

這里還有一些其他Mutable對(duì)象可取的情況。例如mutable對(duì)象傳遞到方法中允許你在不跳過(guò)太多語(yǔ)法的情況下收集多個(gè)結(jié)果。另一個(gè)例子是排序和過(guò)濾,你可以構(gòu)建一個(gè)帶有原有集合的方法,并返回一個(gè)已排序的,不過(guò)這對(duì)大的集合來(lái)說(shuō)會(huì)造成更大的浪費(fèi)。

Top9. Super和Sub構(gòu)造函數(shù)

Java開(kāi)發(fā)者容易犯的十個(gè)錯(cuò)誤是什么

這個(gè)編譯錯(cuò)誤是因?yàn)槟J(rèn)的Super構(gòu)造函數(shù)是未定義的。在Java中,如果一個(gè)類(lèi)沒(méi)有定義一個(gè)構(gòu)造函數(shù),編譯器會(huì)默認(rèn)的為類(lèi)插入一個(gè)無(wú)參數(shù)構(gòu)造函數(shù)。如果一個(gè)構(gòu)造函數(shù)是在Super類(lèi)中定義的,這種情況下Super(String s),編譯器不會(huì)插入默認(rèn)的無(wú)參數(shù)構(gòu)造函數(shù)。

另一方面,Sub類(lèi)的構(gòu)造函數(shù),無(wú)論帶不帶有參數(shù),都會(huì)調(diào)用無(wú)參數(shù)的Super構(gòu)造函數(shù)。

編譯器在Sub類(lèi)中試圖將Super()插入到兩個(gè)構(gòu)造函數(shù)中,但是Super默認(rèn)的構(gòu)造函數(shù)是沒(méi)有定義的,編譯器才會(huì)報(bào)錯(cuò)。如何解決這一問(wèn)題?你只需在Super類(lèi)中添加一個(gè)Super()構(gòu)造函數(shù),如下所示:

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

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

Top10. ""或構(gòu)造函數(shù)?

字符串可以通過(guò)兩種方式創(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開(kāi)發(fā)者容易犯的十個(gè)錯(cuò)誤是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java開(kāi)發(fā)者容易犯的十個(gè)錯(cuò)誤是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

新聞標(biāo)題:Java開(kāi)發(fā)者容易犯的十個(gè)錯(cuò)誤是什么
文章轉(zhuǎn)載:http://bm7419.com/article44/jjejhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、App設(shè)計(jì)、企業(yè)網(wǎng)站制作微信公眾號(hào)、、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)