黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

Java開發(fā)人員比較常犯的10個(gè)錯(cuò)誤


  Java開發(fā)人員比較常犯的10個(gè)錯(cuò)誤

 

  有錯(cuò)誤要避免,看看Java程序員比較常犯的十個(gè)錯(cuò)誤,以后開發(fā)的時(shí)候不要再犯錯(cuò)了哦。

 

  一、把數(shù)組轉(zhuǎn)成ArrayList

 

  為了將數(shù)組轉(zhuǎn)換為ArrayList,開發(fā)者經(jīng)常會這樣做:

 

  Listlist=Arrays.asList(arr);

 

  使用Arrays.asList()

 

  方法可以得到一個(gè)ArrayList,但是得到這個(gè)ArrayList

 

  其實(shí)是定義在Arrays類中的一個(gè)私有的靜態(tài)內(nèi)部類。這個(gè)類雖然和java.util.ArrayList

 

  同名,但是并不是同一個(gè)類。java.util.Arrays.ArrayList

 

  類中實(shí)現(xiàn)了set()

 

  ,get()

 

  ,contains()

 

  等方法,但是并沒有定義向其中增加元素的方法。也就是說通過Arrays.asList()

 

  得到的ArrayList的大小是固定的。

 

  如果在開發(fā)過程中,想得到一個(gè)真正的ArrayList對象(java.util.ArrayList

 

  的實(shí)例),可以通過以下方式:

 

  ArrayListarrayList=newArrayList(Arrays.asList(arr));

 

  java.util.ArrayList

 

  中包含一個(gè)可以接受集合類型參數(shù)的構(gòu)造函數(shù)。因?yàn)閖ava.util.Arrays.ArrayList

 

  這個(gè)內(nèi)部類繼承了AbstractList類,所以,該類也是Collection的子類。

 

  二、判斷一個(gè)數(shù)組是否包含某個(gè)值

 

  在判斷一個(gè)數(shù)組中是否包含某個(gè)值的時(shí)候,開發(fā)者經(jīng)常這樣做:

 

  Setset=newHashSet(Arrays.asList(arr));returnset.contains(targetValue);

 

  在在Java中如何高效的判斷數(shù)組中是否包含某個(gè)元素

 

  一文中,深入分析過,以上方式雖然可以實(shí)現(xiàn)功能,但是效率卻比較低。因?yàn)閷?shù)組壓入Collection類型中,首先要將數(shù)組元素遍歷一遍,然后再使用集合類做其他操作。

 

  在判斷一個(gè)數(shù)組是否包含某個(gè)值的時(shí)候,推薦使用for循環(huán)遍歷的形式或者使用ApacheCommons類庫中提供的ArrayUtils

 

  類的contains

 

  方法。

 

  三、在循環(huán)中刪除列表中的元素

 

  在討論這個(gè)問題之前,先考慮以下代碼的輸出結(jié)果:

 

  ArrayListlist=newArrayList(Arrays.asList("a","b","c","d"));for(inti=0;i<list.size();i++){list.remove(i);}System.out.println(list);

 

  輸出結(jié)果:

 

  [b,d]

 

  以上代碼的目的是想遍歷刪除list中所有元素,但是結(jié)果卻沒有成功。原因是忽略了一個(gè)關(guān)鍵的問題:當(dāng)一個(gè)元素被刪除時(shí),列表的大小縮小并且下標(biāo)也會隨之變化,所以當(dāng)你想要在一個(gè)循環(huán)中用下標(biāo)刪除多個(gè)元素的時(shí)候,它并不會正常的生效。

 

  也有些人知道以上代碼的問題就由于數(shù)組下標(biāo)變換引起的。所以,他們想到使用增強(qiáng)for循環(huán)的形式:

 

  ArrayListlist=newArrayList(Arrays.asList("a","b","c","d"));for(Strings:list){if(s.equals("a")){list.remove(s);}}

 

  但是,很不幸的是,以上代碼會拋出ConcurrentModificationException

 

  ,有趣的是,如果在remove操作后增加一個(gè)break,代碼就不會報(bào)錯(cuò):

 

  ArrayListlist=newArrayList(Arrays.asList("a","b","c","d"));for(Strings:list){if(s.equals("a")){list.remove(s);break;}}

 

  在Java中的fail-fast機(jī)制

 

  一文中,深入分析了幾種在遍歷數(shù)組的同時(shí)刪除其中元素的方法以及各種方法存在的問題。其中就介紹了上面的代碼出錯(cuò)的原因。

 

  迭代器(Iterator)是工作在一個(gè)獨(dú)立的線程中,并且擁有一個(gè)mutex鎖。迭代器被創(chuàng)建之后會建立一個(gè)指向原來對象的單鏈索引表,當(dāng)原來的對象數(shù)量發(fā)生變化時(shí),這個(gè)索引表的內(nèi)容不會同步改變,所以當(dāng)索引指針往后移動(dòng)的時(shí)候就找不到要迭代的對象,所以按照fail-fast原則迭代器會馬上拋出java.util.ConcurrentModificationException

 

  異常。

 

  所以,正確的在遍歷過程中刪除元素的方法應(yīng)該是使用Iterator:

 

  ArrayListlist=newArrayList(Arrays.asList("a","b","c","d"));Iteratoriter=list.iterator();while(iter.hasNext()){Strings=iter.next();if(s.equals("a")){iter.remove();}}

 

  next()

 

  方法必須在調(diào)用remove()

 

  方法之前調(diào)用。如果在循環(huán)過程中先調(diào)用remove()

 

  ,再調(diào)用next()

 

  ,就會導(dǎo)致異常ConcurrentModificationException

 

  。原因如上。

 

  四、HashTable和HashMap的選擇

 

  了解算法的人可能對HashTable比較熟悉,因?yàn)樗且粋€(gè)數(shù)據(jù)結(jié)構(gòu)的名字。但在Java里邊,用HashMap來表示這樣的數(shù)據(jù)結(jié)構(gòu)。Hashtable和HashMap的一個(gè)關(guān)鍵性的不同是,HashTable是同步的,而HashMap不是。所以通常不需要HashTable,HashMap用的更多。

 

  HashMap完全解讀

 

  、Java中常見親屬比較等文章中介紹了他們的區(qū)別和如何選擇。

 

  五、使用原始集合類型

 

  在Java里邊,原始類型和無界通配符類型很容易混合在一起。以Set為例,Set是一個(gè)原始類型,而Set是一個(gè)無界通配符類型。(可以把原始類型理解為沒有使用泛型約束的類型)

 

  考慮下面使用原始類型List作為參數(shù)的代碼:

 

  publicstaticvoidadd(Listlist,Objecto){list.add(o);}publicstaticvoidmain(String[]args){Listlist=newArrayList();add(list,10);Strings=list.get(0);}

 

  上面的代碼將會拋出異常:

 

  java.lang.ClassCastException:java.lang.Integercannotbecasttojava.lang.String

 

  使用原始集合類型是很危險(xiǎn)的,因?yàn)樵技项愋吞^了泛型類型檢查,是不安全的。Set、Set和Set之間有很大差別。關(guān)于泛型,可以參考下列文章:《成神之路-基礎(chǔ)篇》Java基礎(chǔ)知識——泛型

 

  六、訪問級別

 

  程序員們經(jīng)常使用public

 

  作為類中的字段的修飾符,因?yàn)檫@樣可以很簡單的通過引用得到值,但這并不是好的設(shè)計(jì),按照經(jīng)驗(yàn),分配給成員變量的訪問級別應(yīng)該盡可能的低。參考Java中的四種訪問級別

 

  七、ArrayList

 

  與LinkedList

 

  的選擇

 

  當(dāng)程序員們不知道ArrayList

 

  與LinkedList

 

  的區(qū)別時(shí),他們經(jīng)常使用ArrayList,因?yàn)樗雌饋肀容^熟悉。然而,它們之前有巨大的性能差別。在ArrayListvsLinkedListvsVector區(qū)別

 

  、Java中常見親屬比較等文章中介紹過,簡而言之,如果有大量的增加刪除操作并且沒有很多的隨機(jī)訪問元素的操作,應(yīng)該首先LinkedList

 

  。(LinkedList

 

  更適合從中間插入或者刪除(鏈表的特性))

 

  八、可變與不可變

 

  在為什么Java要把字符串設(shè)計(jì)成不可變的

 

  一文中介紹過,不可變對象有許多的優(yōu)點(diǎn),比如簡單,安全等等。同時(shí),也有人提出疑問:既然不可變有這么多好處,為什么不把所有類都搞成不可變的呢?

 

  通常情況下,可變對象可以用來避免產(chǎn)生過多的中間對象。一個(gè)經(jīng)典的實(shí)例就是連接大量的字符串,如果使用不可變的字符串,將會產(chǎn)生大量的需要進(jìn)行垃圾回收的對象。這會浪費(fèi)CPU大量的時(shí)間,使用可變對象才是正確的方案(比如StringBuilder

 

  )。

 

  Stringresult="";for(Strings:arr){result=result+s;}

 

  StackOverflow

 

  中也有關(guān)于這個(gè)的討論。

 

  九、父類和子類的構(gòu)造函數(shù)

 

  上圖的代碼中有兩處編譯時(shí)錯(cuò)誤,原因其實(shí)很簡單,主要和構(gòu)造函數(shù)有關(guān)。首先,我們都知道:

 

  如果一個(gè)類沒有定義構(gòu)造函數(shù),編譯器將會插入一個(gè)無參數(shù)的默認(rèn)構(gòu)造函數(shù)。

 

  如果一個(gè)類中定義了一個(gè)帶參數(shù)的構(gòu)造函數(shù),那么編譯器就不會再幫我們創(chuàng)建無參的構(gòu)造函數(shù)。

 

  上面的Super類中定義了一個(gè)帶參數(shù)的構(gòu)造函數(shù)。編譯器將不會插入默認(rèn)的無參數(shù)構(gòu)造函數(shù)。

 

  我們還應(yīng)該知道:

 

  子類的所有構(gòu)造函數(shù)(無論是有參還是無參)在執(zhí)行時(shí),都會調(diào)用父類的無參構(gòu)造函數(shù)。

 

  所以,編譯器試圖調(diào)用Super類中的無參構(gòu)造函數(shù)。但是父類默認(rèn)的構(gòu)造函數(shù)未定義,編譯器就會報(bào)出這個(gè)錯(cuò)誤信息。

 

  要解決這個(gè)問題,可以簡單的通過

 

  1)在父類中添加一個(gè)Super()構(gòu)造方法,就像這樣:publicSuper(){}

 

  2)移除自定義的父類構(gòu)造函數(shù)

 

  3)在子類的構(gòu)造函數(shù)中調(diào)用父類的super(value)。

 

  十、””還是構(gòu)造函數(shù)

 

  關(guān)于這個(gè)問題,也是程序員經(jīng)常出現(xiàn)困惑的地方,在該如何創(chuàng)建字符串,使用”“還是構(gòu)造函數(shù)?

 

  中也介紹過.

 

  如果你只需要?jiǎng)?chuàng)建一個(gè)字符串,你可以使用雙引號的方式,如果你需要在堆中創(chuàng)建一個(gè)新的對象,你可以選擇構(gòu)造函數(shù)的方式。

 

  在Stringd=newString("abcd")

 

  時(shí),因?yàn)樽置嬷?ldquo;abcd”已經(jīng)是字符串類型,那么使用構(gòu)造函數(shù)方式只會創(chuàng)建一個(gè)額外沒有用處的對象。

 

  更多資訊盡在動(dòng)力節(jié)點(diǎn)官方微信《動(dòng)力節(jié)點(diǎn)Java學(xué)院》,更多好看好玩新聞盡在微信平臺,不定時(shí)的還有小活動(dòng)哦。

 

  

 

上一篇:Java培訓(xùn)的學(xué)費(fèi)是多少?
下一篇:Java培訓(xùn)機(jī)構(gòu)怎么選擇

開班信息

主站蜘蛛池模板: 免费在线黄视频 | 成人免费视频在线看 | 欧美黄色大片免费 | 国产成人精品免费视频大 | 国产成人在线综合 | 国产一级理论片 | 开心婷婷激情五月 | 香蕉视频久久久 | 欧美亚洲中日韩中文字幕在线 | 老子影院午夜伦不卡不四虎卡 | 午夜体验 | 日本一线a视频免费观看 | 亚洲一二三在线 | 免费一级特黄特色大片在线观看看 | 亚洲欧美影视 | 国产高清在线丝袜精品一区 | 色综合日韩| 性a视频| 成人免费视频播放 | 国产高清片 | 日韩一区二区三区免费体验 | 在线观看视频中文字幕 | 久久久久18 | 国产黑丝在线观看 | 亚洲动漫精品 | 韩国精品一区 | 日韩 国产 欧美 | 成人三级网址 | 国产视频二区在线观看 | 免费午夜网站 | 精品国产欧美一区二区三区成人 | 亚洲国产成人精品激情 | 成人免费网站在线观看 | 国产成年人在线观看 | 日韩系列第一页 | 天天躁夜夜躁狠狠躁 | 一区二区高清在线 | 中文字幕亚洲第一 | 日韩色视 | 一级片视频在线 | 成人免费视频在线播放 |