国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Effective Java筆記(6)避免創(chuàng)建不必要的對(duì)象

這篇具有很好參考價(jià)值的文章主要介紹了Effective Java筆記(6)避免創(chuàng)建不必要的對(duì)象。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

????????一般來(lái)說,最好能重用單個(gè)對(duì)象,而不是在每次需要 的時(shí)候就創(chuàng)建一個(gè)相同功能的新對(duì)象 。 重用方式既快速,又流行 。 如果對(duì)象是不可變的( immutable ) (詳見第 17 條),它就始終可以被重用 。

????????作為一個(gè)極端的反面例子,看看下面的語(yǔ)句 :

String s = new String("bikini"); // DON'T DO THIS!

????????該語(yǔ)句每次被執(zhí)行的時(shí)候都創(chuàng)建一個(gè)新的 String 實(shí)例,但是這些創(chuàng)建對(duì)象的動(dòng)作全都是不必要的。 傳遞給 String構(gòu)造器的參數(shù)(bikini)本身就是一個(gè) String 實(shí)例,功能方面等同于構(gòu)造器創(chuàng)建的所有對(duì)象 。 如果這種用法是在一個(gè)循環(huán)中,或者是在一個(gè)被頻繁調(diào)用的方法中,就會(huì)創(chuàng)建出成千上萬(wàn)不必要的 String 實(shí)例 。

????????改進(jìn)后的版本如下所示 :

String s = "bikini";

????????這個(gè)版本只用了 一個(gè) String 實(shí)例,而不是每次執(zhí)行的 時(shí)候都創(chuàng)建一個(gè)新的實(shí)例 。 而且,它可以保證,對(duì)于所有在同一臺(tái)虛擬機(jī)中運(yùn)行的代碼,只要它們包含相同的字符串字面常量,該對(duì)象就會(huì)被重用。

????????對(duì)于同時(shí)提供了靜態(tài) 工廠方法( static factory method) 和構(gòu)造器的不可變類,通常優(yōu)先使用靜態(tài)工廠方法而不是構(gòu)造器,以避免創(chuàng)建不必要的對(duì)象 。 例如,靜態(tài)工廠方法Boolean.valueOf(String )幾乎總是優(yōu)先于構(gòu)造器 Boolean(String),注意構(gòu)造器 Boolean(String)在 Java 9 中已經(jīng)被廢棄了 。 構(gòu)造器在每次被調(diào)用的時(shí)候都會(huì)創(chuàng)建一個(gè)新的對(duì)象,而靜態(tài)工廠方法則從來(lái)不要求這樣做,實(shí)際上也不會(huì)這樣做 。 除了重用不可變的對(duì)象之外,也可以重用那些已知不會(huì)被修改的可變對(duì)象。

????????有些對(duì)象創(chuàng)建的成本比其他對(duì)象要高得多 。 如果重復(fù)地需要這類“昂貴的對(duì)象”,建議將它緩存下來(lái)重用 。 遺憾的是,在創(chuàng)建這種對(duì)象的時(shí)候,并非總是那么顯而易見 。 假設(shè)想要編寫一個(gè)方法,用它確定一個(gè)字符串是否為一個(gè)有效的羅馬數(shù)字 。 下面介紹一種最容易的方法,使用一個(gè)正則表達(dá)式 :

Effective Java筆記(6)避免創(chuàng)建不必要的對(duì)象,Effective Java,java,開發(fā)語(yǔ)言,后端

????????這個(gè)實(shí)現(xiàn)的問題在于它依賴 String.matches 方法 。雖然String.matches 方法最易于查看一個(gè)字符串是否與正則表達(dá)式相匹配 , 但并不適合在注重性能的情形中重復(fù)使用 。 問題在于,它在內(nèi)部為正則表達(dá)式創(chuàng)建了一個(gè) Pattern 實(shí)例,卻只用了一次,之后就可以進(jìn)行垃圾回收了 。 創(chuàng)建Pattern實(shí)例的成本很高 ,因?yàn)樾枰獙⒄齽t表達(dá)式編譯成一個(gè)有限狀態(tài)機(jī)( finite state machine)。

????????為了提升性能,應(yīng)該顯式地將正則表達(dá)式編譯成一個(gè) Pattern實(shí)例(不可變),讓它成為類初始化的一部分,并將它緩存起來(lái),每當(dāng)調(diào)用 isRomanNumeral 方法的時(shí)候就重用同一個(gè)實(shí)例:

Effective Java筆記(6)避免創(chuàng)建不必要的對(duì)象,Effective Java,java,開發(fā)語(yǔ)言,后端

?????????改進(jìn)后的 isRomanNumeral 方法如果被頻繁地調(diào)用,會(huì)顯示出明顯的性能優(yōu)勢(shì)。

????????如果一個(gè)對(duì)象是不變的,那么它顯然能夠被安全地重用,但其他有些情形則并不總是這么明顯 。 考慮適配器( adapter )的情形,有時(shí)也叫作視圖( view ) 。 適配器是指這樣一個(gè)對(duì)象 :它把功能委托給一個(gè)后備對(duì)象( backing object ),從而為后備對(duì)象提供一個(gè)可以替代的接口 。 由于適配器除了后備對(duì)象之外, 沒有其他的狀態(tài)信息,所以針對(duì)某個(gè)給定對(duì)象的特定適配器而言,它不需要?jiǎng)?chuàng)建多個(gè)適配器實(shí)例 。

????????例如 ,Map 接口 的 keySet 方法返回該 Map 對(duì)象的 Set 視圖,其 中包含該 Map 中所有的鍵(key) 。 乍看之下 ,好像每次調(diào)用 keySet 都應(yīng)該創(chuàng)建一個(gè)新 的 Set 實(shí)例,但是,對(duì)于一個(gè)給定的 Map 對(duì)象,實(shí)際上每次調(diào)用 keySet 都返回同樣的 Set 實(shí)例 。 雖然被返回的 Set 實(shí)例一般是可改變的,但是所有返回的對(duì)象在功能上是等同的 :當(dāng)其中一個(gè)返回對(duì)象發(fā)生變化的時(shí)候,所有其他的返回對(duì)象也要發(fā)生變化,因?yàn)樗鼈兪怯?同一個(gè) Map 實(shí)例支撐的 。 雖然創(chuàng)建 key Set 視圖對(duì)象的多個(gè)實(shí)例并無(wú)害處, 卻是沒有必要,也沒有好處的 。

????????另一種創(chuàng)建多余對(duì)象的方法,稱作自動(dòng)裝箱( autoboxing ),它允許程序員將基本類型和裝箱基本類型( Boxed Primitive Type )混用,按需要自動(dòng)裝箱和拆箱 。自動(dòng)裝箱使得基本類型和裝箱基本類型之間的差別變得模糊起來(lái), 但是并沒有完全消除 。 它們?cè)谡Z(yǔ)義上還有著微妙的差別,在性能上也有著比較明顯的差別 。 請(qǐng)看下面的程序,它計(jì)算所有int正整數(shù)值的總和 。 為此,程序必須使用 long 算法,因?yàn)?int 不夠大,無(wú)法容納所有 int 正整數(shù)值的總和:

private static long sum() {
    Long sum = OL;
    for (long i = 0; i <= Integer.MAX_VALUE; i++)
        sum += i;
    return sum;
}

????????這段程序算出的答案是正確的,但是比實(shí)際情況要更慢一些,只因?yàn)榇蝈e(cuò)了一個(gè)字符 。 變量 sum 被聲明成 Long?而不是 long ,意味著程序構(gòu)造了大約 231 個(gè)多余的 Long 實(shí)例(大約每次往 Long sum 中增加 long時(shí)構(gòu)造一個(gè)實(shí)例) 。 將 sum 的聲明從 Long 改成long ,在我的機(jī)器上使運(yùn)行時(shí)間從 6.3 秒減少到了 0 . 59 秒 。 結(jié)論很明顯 :要優(yōu)先使用 基本類型而不是裝箱基本類型,要當(dāng)心無(wú)意識(shí)的自動(dòng)裝箱 。

????????不要錯(cuò)誤地認(rèn)為本條目所介紹的內(nèi)容暗示著“創(chuàng)建對(duì)象的代價(jià)非常昂貴,我們應(yīng)該要盡可能地避免創(chuàng)建對(duì)象” 。 相反,由于小對(duì)象的構(gòu)造器只做很少量的顯式工作,所以小對(duì)象的創(chuàng)建和回收動(dòng)作是非常廉價(jià)的,特別是在現(xiàn)代的 JVM 實(shí)現(xiàn)上更是如此 。 通過創(chuàng)建附加的對(duì)象,提升程序的清晰性、簡(jiǎn)潔性和功能性,這通常是件好事 。

????????反之,通過維護(hù)自己的對(duì)象池( object pool )來(lái)避免創(chuàng)建對(duì)象并不是一種好的做法,除非池中的對(duì)象是非常重量級(jí)的 。 正確使用對(duì)象池的典型對(duì)象示例就是數(shù)據(jù)庫(kù)連接池 。 建立數(shù)據(jù)庫(kù)連接的代價(jià)是非常昂貴的,因此重用這些對(duì)象非常有意義 。 而且,數(shù)據(jù)庫(kù)的許可可能限制你只能使用一定數(shù)量的連接 。 但是,一般而言,維護(hù)自己的對(duì)象池必定會(huì)把代碼弄得很亂,同時(shí)增加內(nèi)存占用( footprint ),并且還會(huì)損害性能 。 現(xiàn)代的 JVM 實(shí)現(xiàn)具有高度優(yōu)化的垃圾回收器,其性能很容易就會(huì)超過輕量級(jí)對(duì)象池的性能 。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-558781.html

到了這里,關(guān)于Effective Java筆記(6)避免創(chuàng)建不必要的對(duì)象的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 設(shè)計(jì)模式第九講:常見重構(gòu)技巧 - 去除不必要的!=

    設(shè)計(jì)模式第九講:常見重構(gòu)技巧 - 去除不必要的!=

    項(xiàng)目中會(huì)存在大量判空代碼,多么丑陋繁冗!如何避免這種情況?我們是否濫用了判空呢?本文是設(shè)計(jì)模式第九講,講解常見重構(gòu)技巧:去除不必要的!= 通常是這樣的 初步的,使用Apache Commons,Guvava,Hutool等 StringUtils 考慮用Assert斷言 逐級(jí)判斷空,還是拋出自定義異常,還是

    2024年02月11日
    瀏覽(24)
  • 在應(yīng)用程序中發(fā)現(xiàn)不必要的 Http 響應(yīng)頭

    在應(yīng)用程序中發(fā)現(xiàn)不必要的 Http 響應(yīng)頭

    ? 響應(yīng)頭中多了: Server: nginx/1.24.0 ? 在服務(wù)器塊下的nginx.conf中添加以下參數(shù) 保存nginx.conf文件, 然后重新啟動(dòng)Nginx以查看結(jié)果。

    2024年02月12日
    瀏覽(22)
  • 漏洞修復(fù):在應(yīng)用程序中發(fā)現(xiàn)不必要的 Http 響應(yīng)頭

    漏洞修復(fù):在應(yīng)用程序中發(fā)現(xiàn)不必要的 Http 響應(yīng)頭

    blablabla描述,一般是在返回的響應(yīng)表頭中出現(xiàn)了Server鍵值對(duì),那我們要做的就是移除它,解決方案中提供了nginx的解決方案 第一種解決方案 當(dāng)前解決方案會(huì)隱藏nginx的版本號(hào),但還是會(huì)返回nginx字樣,如果想再?gòu)氐c(diǎn),參考第二種解決方案 or 第二種解決方案 當(dāng)前方法需要安裝

    2024年02月09日
    瀏覽(17)
  • nginx解決不必要的 Http 響應(yīng)頭漏洞(自定義server信息及隱藏版本號(hào))

    nginx解決不必要的 Http 響應(yīng)頭漏洞(自定義server信息及隱藏版本號(hào))

    1.自定義server信息 修改nginx解壓目錄下的/src/core/nginx.h文件 ? ? 修改nginx解壓目錄下的/src/http/ngx_http_header_filter_module.c文件 修改?nginx解壓目錄下的/src/http/ngx_http_special_response.c文件 ?全部修改完成后,執(zhí)行./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_sub_module --w

    2024年02月14日
    瀏覽(28)
  • idea提交代碼到git或svn上時(shí),怎么忽略.class、.iml文件和文件夾等不必要的文件

    idea提交代碼到git或svn上時(shí),怎么忽略.class、.iml文件和文件夾等不必要的文件

    在Setings– Editor -- File Types --Ignore files and folders中添加需要忽略的文件和文件夾: 注意事項(xiàng): 千萬(wàn)不要忽略.class文件, 千萬(wàn)不要忽略.class文件, 千萬(wàn)不要忽略.class文件, 重要的事說三遍,因?yàn)槿绻裞lass文件也忽略的話,就會(huì)導(dǎo)致java自帶的類大批量報(bào)錯(cuò),如果要忽略class文

    2024年03月24日
    瀏覽(161)
  • Effective Java筆記(29)優(yōu)先考慮泛型

    Effective Java筆記(29)優(yōu)先考慮泛型

    ????????一般來(lái)說 ,將集合聲 明參數(shù)化,以及使用 JDK 所提供的泛型方法,這些都不太困難 。編寫自己的泛型會(huì)比較困難一些,但是值得花些時(shí)間去學(xué)習(xí)如何編寫 。 ????????以簡(jiǎn)單的(玩具)堆校實(shí)現(xiàn)為例 : ????????這個(gè)類應(yīng)該先被參數(shù)化,但是它沒有,我們可

    2024年02月13日
    瀏覽(23)
  • Effective Java筆記(20)接口優(yōu)于抽象類

    ????????Java提供了兩種機(jī)制,可以用來(lái)定義允許多個(gè)實(shí)現(xiàn)的類型:接口和抽象類。自從Java 8為繼承引入了 缺省方法 ( default method),這兩種機(jī)制都允許為某些實(shí)例方法提供實(shí)現(xiàn)。主要的區(qū)別在于,為了實(shí)現(xiàn)由抽象類定義的類型,類必須成為抽象類的一個(gè)子類。因?yàn)镴ava只允許

    2024年02月14日
    瀏覽(24)
  • Effective Java筆記(30)優(yōu)先考慮泛型方法

    Effective Java筆記(30)優(yōu)先考慮泛型方法

    ????????正如類可以從泛型中受益一般 ,方法也一樣。靜態(tài)工具方法尤其適合于泛型化 。 Collections 中的所有“算法”方法(例如 binarySearch 和 sort )都泛型化了 。 ????????編寫泛型方法與編寫泛型類型相類似 。 例如下面這個(gè)方法,它返回兩個(gè)集合的聯(lián)合 : ?????

    2024年02月13日
    瀏覽(24)
  • Effective Java筆記(5)優(yōu)先考慮依賴注入來(lái)引用資源

    ????????有許多類會(huì)依賴一個(gè)或多個(gè)底層的資源 。 例如,拼寫檢查器需要依賴詞典 。 因此,像下面這樣把類實(shí)現(xiàn)為靜態(tài)工具類的做法并不少見(詳見第 4 條): ????????同樣地,將這些類實(shí)現(xiàn)為 Singleton 的做法也并不少見(詳見第 3 條) : ????????以上兩種方法

    2024年02月15日
    瀏覽(26)
  • Effective Java筆記(11)覆蓋 equals 時(shí)總要覆蓋 hashCode

    ???????? 在每個(gè) 覆蓋了 equals 方法的類中,都 必須 覆蓋 hashCode 方法 。 如果不這樣做的話,就會(huì)違反 hashCode 的通用約定,從而導(dǎo)致該類無(wú)法結(jié)合所有基于散列的集合一起正常運(yùn)作,這類集合包括 HashMap 和 HashSet 。 下面是約定的內(nèi)容,摘自 Object 規(guī)范: 1、在應(yīng)用程序的執(zhí)

    2024年02月15日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包