避免建立沒必要要的對象(5)

一、不要每次都建立一個相同功能的新對象:數據庫

  • 極端反例:每次在堆上建立一個對象,第一次會在常量池建立字符串新對象

  • 改進後:每次棧上建立引用,第一次會在常量池建立字符串新對象
  • 第一次指同一臺虛擬機的第一次

二、靜態工廠優於構造器的很重要緣由:安全

  • 構造器必須每次都建立新對象
  • 靜態工廠則不必

舉例:性能

使用靜態初始化器改進後,性能大幅度提高:優化

  • final 靜態域,會被做爲常量使用
  • Calendar 建立代價很高
  • 能夠進一步優化到延時初始化
  • 可是不建議:緣由是方法實現複雜、沒法使性能顯著 提升超過 現有水平

三、像適配器這樣的場景,性能提高不明顯對象

  • 適配器把功能委託給後備對象,爲後備對象提供一個能夠替代的接口
  • 不須要建立多個適配器實例

四、Map接口的 keySet() 方法每次都返回相同的 Set實例接口

  • 連續使用Map遍歷時,能夠考慮優化

五、自動封裝內存

  • 容許基本類型和封裝基本類型混用,自動裝箱 拆箱
  • 兩種類型語義上模糊,可是性能上差距明顯
  • 優先使用基本類型,避免無心識的自動裝箱
  • 每次往Long sum中添加 long 類型時,建立一個Long實例
  • 下述代碼把 Long sum  改成long(基本類型)
  • 性能從40秒加,減小到6秒加

六、本條並沒有 讓咱們避免建立對象的意思字符串

  • 緣由是:小對象的建立和回收一般比較廉價
  • 並且,建立附加對象能提高代碼的清晰性、簡潔性和功能性
  • 是件好事

七、使用重量級對象時,才建議使用對象池虛擬機

  • 典型事例:數據庫鏈接池
  • 輕量級對象池得不償失:代碼變亂、增長內存負擔
  • JVM優化很容易使 不建立輕量級對象池的性能 優於 建立

八、保護性拷貝<39條>遍歷

  • 在重用對象付出的代價遠大於 建立新對象時,保護性拷貝
  • 沒進行保護性拷貝,可能致使潛在錯誤或安全漏洞
相關文章
相關標籤/搜索