1. 程式人生 > >05、避免建立不必要的物件

05、避免建立不必要的物件

1. 最好能重用物件而不是在每次需要的時候就建立一個相同功能的新物件
2. 對於同時提供了靜態工廠方法和構造器的不可變類,通常可以使用靜態工廠方法而不是構造器,以避免建立不必要的物件。例如:Boolean.valueOf(String)幾乎走勢優先於構造器Boolean(String)
3. 除了重用不可變的物件之外,也可以重用那些已知不會被改變的可變物件 建立了不必要物件的Person1類
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Person1 {
    private Date birthDate;

    public Person1(Date birthDate) {
        this.birthDate = birthDate;
    }

    /**
     * 不要這麼做,一定
     * 
     * @return
     */
    public boolean isBabyBoomer() {
        Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
        Date boomStart = gmtCal.getTime();
        gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
        Date boomEnd = gmtCal.getTime();
        return birthDate.compareTo(boomStart) >= 0
                && birthDate.compareTo(boomEnd) < 0;
    }
}
重用了不變物件的Person2類
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class Person2 {
    private Date birthDate;

    private static final Date BOOM_START;
    private static final Date BOOM_END;
    static {
        Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
        gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
        BOOM_START = gmtCal.getTime();
        gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
        BOOM_END = gmtCal.getTime();
    }

    public Person2(Date birthDate) {
        this.birthDate = birthDate;
    }

    public boolean isBabyBoomer() {
        return birthDate.compareTo(BOOM_START) >= 0
                && birthDate.compareTo(BOOM_END) < 0;
    }
}
測試方法,並且列印耗時,以及耗時倍數
import java.util.Date;

public class PersonMain {
    public static void main(String[] args) {
        int time = (int) (System.currentTimeMillis() / 1000);
        int testTimes = 10000000;

        long person1Start = System.currentTimeMillis();
        for (int i = time - testTimes; i < time; i++) {
            Person1 p = new Person1(new Date(i * 1000L));
            p.isBabyBoomer();
        }
        long person1End = System.currentTimeMillis();
        long cost1 = person1End - person1Start;
        System.out.println(cost1);

        long person2Start = System.currentTimeMillis();
        for (int i = 0; i < testTimes; i++) {
            Person2 p = new Person2(new Date(i * 1000L));
            p.isBabyBoomer();
        }
        long person2End = System.currentTimeMillis();
        long cost2 = person2End - person2Start;
        System.out.println(cost2);
        System.out.println(cost1 / cost2);
    }
}

java提供的自動裝箱功能提供了方便,但是也建立了不必要的物件,所以要優先使用基本型別而不是裝箱基本型別,要當心無意識的自動裝箱

public class AutoBoxing {
    public static void main(String[] args) {
        long start1 = System.currentTimeMillis();
        Long sum1 = 0L;
        for (long i = 0; i < Integer.MAX_VALUE; i++) {
            sum1 += i;
        }
        System.out.println(sum1);
        long end1 = System.currentTimeMillis();
        long cost1 = end1 - start1;
        System.out.println(cost1);
        long start2 = System.currentTimeMillis();
        long sum2 = 0L;
        for (long i = 0; i < Integer.MAX_VALUE; i++) {
            sum2 += i;
        }
        System.out.println(sum2);
        long end2 = System.currentTimeMillis();
        long cost2 = end2 - start2;
        System.out.println(cost2);
        System.out.println(cost1 / cost2);
    }
}

通過維護自己的物件池(object pool)來避免建立物件並不是一種好的做法,除非池中的物件是非常重量級的。真正正確使用物件池的典型物件示例就是資料庫連線池。

相關推薦

05避免建立必要物件

1. 最好能重用物件而不是在每次需要的時候就建立一個相同功能的新物件 2. 對於同時提供了靜態工廠方法和構造器的不可變類,通常可以使用靜態工廠方法而不是構造器,以避免建立不必要的物件。例如:Boolean.valueOf(String)幾乎走勢優先於構造器Boolean(S

Effective Java 第三版讀書筆記——條款6:避免建立必要物件

通常來講,重用一個物件比建立一個功能相同的物件更加合適。重用速度更快,並且更接近現代的程式碼風格。如果物件是不可變的(條款 17),它總是可以被重用。 考慮一個極端的例子: String s = new String("bikini"); // DON'T DO THIS! 這

第5條:避免建立必要物件

一、一般來說,最好能重用物件而不是在每次需要的時候就建立一個相同功能的新物件。 String s = new String("stringette");//DON'T DO THIS //改進後的版

讀書筆記-《Effective Java》第5條:避免建立必要物件

 1. 這種寫法每次執行都會建立一個物件(存放於堆)。 String str1 = new String("ttt"); 改進後(存放於方法區常量池),當常量池已存在,則不會重複建立。 String str2 = "ttt"; 2. 應優先使用基本資料型別(int、long

如何在Android中避免建立必要物件

在程式設計開發中,記憶體的佔用是我們經常要面對的現實,通常的記憶體調優的方向就是儘量減少記憶體的佔用。這其中避免建立不必要的物件是一項重要的方面。 Android裝置不像PC那樣有著足夠大的記憶體,而且單個App佔用的記憶體實際上是比較小的。所以避免建立

Effective Java 第五條:避免建立必要物件

反例: public class Person { private final Date birthDate; public Person(Date birthDate) { this.birthDate = birthDate;

effictive--避免建立必要物件

demo01: package com.xiaohao.effective; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; /** * 避免建立不必要的物件Ca

EffactiveJava-避免建立必要物件

類是Java程式的基本組成單元,在程式執行過程中要通過建立大量的物件來執行整個系統的執行,單有些物件唄建立的代價是高昂的,例如資料庫連線、Spring的ApplicationContext等,這類物件往往用單例強化成全域性唯一,另外一些物件相對來說建立代價會小很

高效Java05:避免建立必要物件

就像我們大部分人所知道的,最好能重用物件,而不是每次都重複建立一個功能相同的新物件,下面舉幾個例子說明這個點。 重用不可變物件 如果物件是不可變的,那麼它就始終可以被重用。對於同時提供了靜態工廠方法和構造方法的不可變類,通常使用靜態工廠方法而不是構造方法

Effective Java之避免建立必要物件(五)

1.對於不可變類(immutable),他始終可以被重用。 如:String類 String s = new String(“string”); 這種方法建立了兩個String物件,因為傳入String構造器的引數本身就是一個String例項,new再建立

Python中的可變物件和可變物件Python對於可變物件列表和可變物件列表做列表乘法

Python中的不可變物件和可變物件: 不可變物件指該物件所指向的記憶體中的值不能被改變。當改變某個變數時候,由於其所指的值不能被改變,相當於把原來的值複製一份後再改變,這會開闢一個新的地址,變數再指向這個新的地址。 可變物件指該物件所指向的記憶體中的值可以被改變。變數(準確的說是引用)

Java 建立可變物件-final關鍵字的使用總結

之前一直對final這個關鍵的功能,很模糊。在程式設計中很多次都是使用eclispe自動在變數前加的final關鍵字,一直對這個好奇,今天找了些資料,對final進行地深入學習。 嚴格地說final修飾的變數不可被改變,一旦獲得了初始值,該fina

1避免創建必要的對象

創建對象 ger 簡潔 每次 final nal turn fin 什麽 一般來說,最好能重用對象而不是在每次需要的時候就創建一個相同功能的新對象。 1、去除重復創建的字符串實例 1 String s = new String("china"); 2 // "china"

【讀書筆記 - Effective Java】05. 避免創建必要的對象

auto ive effective zone 如果 方式 一次 body 安全 1. 如果對象是不可變的(immutable),它就始終可以被重用。 (1) 特別是String類型的對象。 String str1 = new String("str"); // 創建許多

合理使用前端開發工具來避免必要的錯誤

統一 adding 顯示 語法提示 導致 pad 插件 fin ide 前端開發工作中,難免會因為自身的一些粗心大意而照成一些錯誤,比如說單詞拼寫、路徑引用、符號寫錯等等,對於這些問題往往自己很難發現,然而通過給前端IDE添加插件是可以解決的。 順便總結一下常見代

《Effective Java 中文版 第2版》學習筆記 第5條:避免創建必要的對象

多余 除了 示例 中文 註意 構造器 stat get tro   最好能重用對象而不是在每次需要的時候就創建一個相同功能的新對象。如果對象是不可變的,它就始終可以被重用。 1 String s = new String("stringette");   每次執行該語句

【轉】編寫高質量代碼改善C#程序的157個建議——建議31:在LINQ查詢中避免必要的叠代

public line linq查詢 接收 string 第一個元素 style 屬性 但是 建議31:在LINQ查詢中避免不必要的叠代 無論是SQL查詢還是LINQ查詢,搜索到結果立刻返回總比搜索完所有的結果再將結果返回的效率要高。 示例代碼: class

如何建立.gitignore檔案,忽略git必要提交的檔案

1、在需要建立 .gitignore 檔案的資料夾, 右鍵選擇Git Bash 進入命令列,進入專案所在目錄。 2、輸入 touch .gitignore ,生成“.gitignore”檔案。 3、在”.gitignore” 檔案裡輸入你要忽略的資料夾及其檔案就可以了。(注意格式) 我的

自開發程式加許可權控制(SU21建立許可權物件PFCG建立Role)

自開發程式的許可權控制,需要先在SU21裡面建立新的許可權物件,把新的許可權物件給開發,讓開發在程式碼程式裡面加一段控制程式碼(建立、修改、顯示),再將這個建立好的許可權物件PFCG分配,或者不用建立新的許可權物件,直接用標準的許可權物件(比如一個自開發報表需要根據工廠去控制權限,直接把標準

python知識整理--議可變物件可變物件以及strlisttupledictset

可變物件:變數、list 不可變物件:str、tuple、dict、set 1、變數是可變的不用多說,變數賦值一次便改變一次。 2、list 可變物件,可對list進行如下新增刪除排序等操作。 list = [2,3,5,1,2] list.append(8) list.insert(0,