第47條:了解和使用類庫(kù)

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ù)普通程序員在同樣的功能上所能夠給予的投入威鹿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市轨香,隨后出現(xiàn)的幾起案子忽你,更是在濱河造成了極大的恐慌,老刑警劉巖弹沽,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件檀夹,死亡現(xiàn)場(chǎng)離奇詭異筋粗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)炸渡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門娜亿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚌堵,你說我怎么就攤上這事买决。” “怎么了吼畏?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵督赤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我泻蚊,道長(zhǎng)躲舌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任性雄,我火速辦了婚禮没卸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秒旋。我一直安慰自己约计,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布迁筛。 她就那樣靜靜地躺著煤蚌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪细卧。 梳的紋絲不亂的頭發(fā)上尉桩,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音酒甸,去河邊找鬼魄健。 笑死,一個(gè)胖子當(dāng)著我的面吹牛插勤,可吹牛的內(nèi)容都是我干的沽瘦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼农尖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼析恋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盛卡,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤助隧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體并村,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巍实,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哩牍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棚潦。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖膝昆,靈堂內(nèi)的尸體忽然破棺而出丸边,到底是詐尸還是另有隱情,我是刑警寧澤荚孵,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布妹窖,位于F島的核電站,受9級(jí)特大地震影響收叶,放射性物質(zhì)發(fā)生泄漏骄呼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一判没、第九天 我趴在偏房一處隱蔽的房頂上張望谒麦。 院中可真熱鬧,春花似錦哆致、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至踪蹬,卻和暖如春胞此,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跃捣。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工漱牵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疚漆。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓酣胀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親娶聘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子闻镶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)丸升,斷路器铆农,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法狡耻,內(nèi)部類的語法墩剖,繼承相關(guān)的語法猴凹,異常的語法,線程的語...
    子非魚_t_閱讀 31,625評(píng)論 18 399
  • 轉(zhuǎn)自http://blog.csdn.net/xugangwen/article/details/44811783...
    扎Zn了老Fe閱讀 12,727評(píng)論 1 142
  • 方法1 (數(shù)據(jù)類型)(最小值+Math.random()*(最大值-最小值+1)) 例: (int)(1+Math...
    GB_speak閱讀 40,994評(píng)論 2 6
  • 問題: 臺(tái)式機(jī)岭皂,Win10系統(tǒng) 正常使用時(shí)經(jīng)常死機(jī)郊霎,無緣無故卡死了,不能開啟任務(wù)管理器蒲障,任何按鍵和點(diǎn)擊都不管用歹篓,按...
    晨箜閱讀 396評(píng)論 0 0