java類庫(kù)就是由一堆java類打包在一起組成的庫(kù),封裝一些類方便你使用专普,比如Map,List這種。
類庫(kù)(Class Library)是一個(gè)綜合性的面向?qū)ο蟮目芍赜妙愋图贤ń瘢@些類型包括:接口菊卷、抽象類和具體類柑贞。類庫(kù)可以解決一系列常見編程任務(wù)(包括諸如字符串管理、數(shù)據(jù)收集、數(shù)據(jù)庫(kù)連接以及文件訪問等任務(wù))仍翰,還可以解決多種專用開發(fā)任務(wù)(控制臺(tái)應(yīng)用程序、桌面應(yīng)用程序观话、WEB應(yīng)用程序等)予借。
假設(shè)你希望產(chǎn)生位于0和某個(gè)上界之間的隨機(jī)整數(shù)。面對(duì)這個(gè)常見的任務(wù)频蛔,?許多程序員會(huì)編寫出如下所示的方法:
這個(gè)方法看起來可能不錯(cuò)灵迫,但是卻有三個(gè)缺點(diǎn)。第一個(gè)缺點(diǎn)是晦溪,如果n是一個(gè)比較小的2的乘方瀑粥,經(jīng)過一段相當(dāng)短的周期之后,它產(chǎn)生的隨機(jī)數(shù)序列將會(huì)重復(fù)尼变。第二個(gè)缺點(diǎn)是利凑,如果n不是2的乘方,那么平均起來嫌术,有些數(shù)會(huì)比其他的數(shù)出現(xiàn)得更為頻繁哀澈。如果n比較大,這個(gè)缺 點(diǎn)就會(huì)非常明顯度气。這可以通過下面的程序直觀地體現(xiàn)出來割按,它會(huì)產(chǎn)生一百萬個(gè)經(jīng)過細(xì)心指定的范圍內(nèi)的隨機(jī)數(shù),并打印出有多少個(gè)數(shù)字落在隨機(jī)數(shù)取值范圍的前半部分:
如果random方法工作正常的話磷籍,這個(gè)程序打印出來的數(shù)將接近于一百萬的一半适荣,但是如 果真正運(yùn)行這個(gè)程序,就會(huì)發(fā)現(xiàn)它打印出來的數(shù)接近于666 666院领。由random方法產(chǎn)生的數(shù)字有 2/3落在隨機(jī)數(shù)取值范圍的前半部分弛矛。
random方法的第三個(gè)缺點(diǎn)是,在極少數(shù)情況下比然,它的失敗是災(zāi)難性的丈氓,返回一個(gè)落在指 定范圍之外的數(shù)。之所以如此强法,是因?yàn)檫@個(gè)方法試圖通過調(diào)用Math.abs,將rnd.nextlnt()返回的值映射為一個(gè)非負(fù)整數(shù)int万俗。如果nextlnt()返回Integer.MIN_VALUE,那么Math.abs也會(huì)返 回Integer.MIN_VALUE,假設(shè)n不是2的乘方,那么取模操作符(%)將返回一個(gè)負(fù)數(shù)饮怯。這幾 乎肯定會(huì)使程序失敗闰歪,而且這失敗很難重現(xiàn)。
為了編寫能修正這三個(gè)缺點(diǎn)的random方法蓖墅,有必要了解關(guān)于偽隨機(jī)數(shù)生成器库倘、數(shù)論和2的求補(bǔ)算法的相關(guān)知識(shí)临扮。幸運(yùn)的是,你并不需要自己來做這些工作——已經(jīng)有現(xiàn)成的成果可以為 你所用于樟。它被稱為Random.nextlnt(int),自Java1.2發(fā)行版本以來公条,它已經(jīng)成了Java平臺(tái)的一部分。
你無需關(guān)心nextlnt(int)的實(shí)現(xiàn)細(xì)節(jié)(如果你有強(qiáng)烈的好奇心迂曲,可以研究它的文檔或者源代碼)。具有算法背景的高級(jí)工程師已經(jīng)花了大量的時(shí)間來設(shè)計(jì)寥袭、實(shí)現(xiàn)和測(cè)試這個(gè)方法路捧,然后經(jīng)過這個(gè)領(lǐng)域中的專家的審査,以確保它的正確性传黄。然后杰扫,標(biāo)準(zhǔn)類庫(kù)經(jīng)過了Beta測(cè)試、發(fā)行和近十年的成千上萬程序員的廣泛使用膘掰。在這個(gè)方法中還沒有發(fā)現(xiàn)過缺陷章姓,但是,如果將來發(fā)現(xiàn)有缺陷识埋,在下一個(gè)發(fā)行版本中就會(huì)修正這些缺陷凡伊。通過使用標(biāo)準(zhǔn)類庫(kù),可以充分利用這些 編寫標(biāo)準(zhǔn)類庫(kù)的專家的知識(shí)窒舟,以及在你之前的其他人的使用經(jīng)驗(yàn)系忙。
使用標(biāo)準(zhǔn)類庫(kù)的第二個(gè)好處是,不必浪費(fèi)時(shí)間為那些與工作不太相關(guān)的問題提供特別的解決方案惠豺。就像大多數(shù)程序員一樣银还,應(yīng)該把時(shí)間花在應(yīng)用程序上,而不是底層的細(xì)節(jié)上洁墙。
使用標(biāo)準(zhǔn)類庫(kù)的第三個(gè)好處是蛹疯,它們的性能往往會(huì)隨著時(shí)間的推移而不斷提髙,無需你做任何努力热监。因?yàn)樵S多人在使用它們捺弦,被當(dāng)作工業(yè)標(biāo)準(zhǔn)在使用,所以狼纬,提供這些標(biāo)準(zhǔn)類庫(kù)的組 織有強(qiáng)烈的動(dòng)機(jī)要使它們運(yùn)行得更快羹呵。這些年來,許多Java平臺(tái)類庫(kù)已經(jīng)被重新編寫了疗琉,有時(shí)候是重復(fù)編寫冈欢,從而導(dǎo)致性能上有了顯著的提髙。
標(biāo)準(zhǔn)類庫(kù)也會(huì)隨著時(shí)間的推移而增加新的功能盈简。如果類庫(kù)中漏掉了某些功能凑耻,開發(fā)者社區(qū)(developer community)就會(huì)把這些缺點(diǎn)告示出來太示,漏掉的功能就會(huì)添加到后續(xù)的發(fā)行版本中。Java平臺(tái)類庫(kù)始終是在這個(gè)社區(qū)的推動(dòng)下不斷發(fā)展的香浩。
使用標(biāo)準(zhǔn)類庫(kù)的最后一個(gè)好處是类缤,可以使自己的代碼融入主流。這樣的代碼更易讀邻吭、更易維護(hù)餐弱、更易被大多數(shù)的開發(fā)人員重用。
既然有那么多的優(yōu)點(diǎn)囱晴,使用標(biāo)準(zhǔn)類庫(kù)機(jī)制而不選擇專門的實(shí)現(xiàn)膏蚓,這顯然是符合邏輯的,然而還是有相當(dāng)一部分的程序員沒有這樣做畸写。為什么呢驮瞧?可能他們并不知道有這些類庫(kù)機(jī)制的存在。在每個(gè)重要的發(fā)行版本中枯芬,都會(huì)有許多新的特性被加入到類庫(kù)中论笔,所以與這些新特性保持同步是值得的。每次Java平臺(tái)有重要的發(fā)行時(shí)千所,Sun公司都會(huì)發(fā)布一個(gè)網(wǎng)頁狂魔,說明新的特性。這些網(wǎng)頁值得好好讀一讀真慢。這些標(biāo)準(zhǔn)類庫(kù)太龐大了毅臊,以至于不可能去學(xué)習(xí)所有的文檔,但是每個(gè)程序員都應(yīng)該熟悉java.lang,java.util,某種程度上還有java.io中的內(nèi)容。關(guān)于其他類庫(kù)的知識(shí)可以根據(jù)需要隨時(shí)學(xué)習(xí)黑界。
本條目不可能總結(jié)類庫(kù)中所有的便利工具管嬉,但是有兩種工具值得特別--提。在1.2發(fā)行版本中朗鸠,Collections Framework(集合框架)被加入到了java.util包中蚯撩。它應(yīng)該成為每個(gè)程序 員基本工具箱中的一部分。Collections Framework是一個(gè)統(tǒng)一的體系結(jié)構(gòu)烛占,用來表示和操作集合胎挎,允許它們對(duì)集合進(jìn)行獨(dú)立于表示細(xì)節(jié)的操作。它減輕了編程的負(fù)擔(dān)忆家,同時(shí)還提升了性能犹菇。它考慮到不相關(guān)的API之間的互操作性,減少了為設(shè)計(jì)和學(xué)習(xí)新的API所要付出的努力芽卿,并且鼓勵(lì)軟件重用揭芍。如果想要了解更多這方面的細(xì)節(jié),請(qǐng)參見Sun公司網(wǎng)站上的文章[Collections],或者閱讀有關(guān)的教程卸例。
1.5發(fā)行版本中称杨,在java.util.concurrent包中增加了一組并發(fā)實(shí)用工具肌毅。這個(gè)包既包含高級(jí)的并發(fā)工具來簡(jiǎn)化多線程的編程任務(wù),還包含低級(jí)別的并發(fā)基本類型姑原,允許專家們自己編寫更髙級(jí)的并發(fā)抽象悬而。java.util.concurrent的髙級(jí)部分,也應(yīng)該是每個(gè)程序員基本工具箱中的—部分(見第68條和第69條)锭汛。
在有些情況下笨奠,一個(gè)類庫(kù)工具并不能滿足你的需要。你的需求越是特殊唤殴,這種情形就越有可能發(fā)生艰躺。雖然你的第一個(gè)念頭應(yīng)該是使用標(biāo)準(zhǔn)類庫(kù),但是眨八,如果你在觀察了它們?cè)谀承╊I(lǐng)域所提供的功能之后,確定它不能滿足需要左电,你就得使用其他的實(shí)現(xiàn)廉侧。任何一組類庫(kù)所提供的功能總是難免會(huì)有遺漏。如果你所需要的功能不存在篓足,那么段誊,就只能自己實(shí)現(xiàn)這些功能, 別無選擇栈拖。
總而言之连舍,不要重新發(fā)明輪子。如果你要做的事情看起來是十分常見的涩哟,有可能類庫(kù)中已經(jīng)有某個(gè)類完成了這樣的工作索赏。如果確實(shí)是這樣,就使用現(xiàn)成的贴彼,如果還不清楚是否存在這樣的類潜腻,就去査一査。一般而言器仗,類庫(kù)的代碼可能比你自己編寫的代碼更好一些融涣,并且會(huì)隨著時(shí)間的推移而不斷改進(jìn)。這并不是在影射你作為一個(gè)程序員的能力精钮。從經(jīng)濟(jì)角度的分析表明:類庫(kù)代碼受到的關(guān)注遠(yuǎn)遠(yuǎn)超過大多數(shù)普通程序員在同樣的功能上所能夠給予的投入威鹿。