2011-06-03 63 views

回答

18

泛型是編譯時的功能。運行應用程序時幾乎沒有影響。

像大多數表現問題一樣;編寫清晰簡單的代碼顯得尤爲重要,而且這通常會帶來非常好的性能。

改變您對性能的原因的設計是一個經常犯錯有人說你不應該這樣做。在開始之前,我認爲這是值得考慮的,但是當你有一個相對微不足道的表現問題時,你必須認識到這一點。

當你有一個更好的瞭解你的應用程序如何表現你最好寫你的代碼,並隨後對其進行優化。即當你是真正的用例和分析器時。

10

它會影響應用程序的性能嗎?

不,不會,因爲它甚至沒有出現在運行時會影響性能。

來自官方的線索:

當一個泛型類型實例化時,編譯器的技術叫做類型擦除轉換的類型 - 一個過程,其中,編譯器將刪除所有相關信息,輸入參數和類型參數在一個類或方法中。


正如我已經說明here這兩個程序轉換爲同樣的字節碼:

import java.util.*; 

class Test { 
    public static void main(String[] args) { 
     List<String> l = new ArrayList<String>(); 
     l.add("hello"); 
     System.out.println(l.get(0).length()); 
    } 
} 

 

import java.util.*; 

class Test2 { 
    public static void main(String[] args) { 
     List l = new ArrayList(); 
     l.add("hello"); 
     System.out.println(((String) l.get(0)).length()); 
    } 
} 
+7

@downvoter,爲什麼downvote?請說明理由。 – 2011-06-03 07:53:28

+3

不知道他們爲什麼低估,但我可以想象一些人(像我)不會同意你的解釋。你應該比較性能是一個MyClass 並啓動它與T =字符串,並直接實現MyClass 沒有泛型。這在性能上很重要。通常不會太多,但是當你將它們放在算法的內部循環中時,這可以輕鬆地降低50%的性能損失,正如這個簡單的例子所示:http://pastebin.com/QeCW0W1R(我知道它是壞的分析,但只做5次,然後5次,測試順序顛倒,它總是相同的) – user1111929 2012-09-09 07:52:51

3

泛型不會影響運行時性能。但是,它們可能會對您的開發性能產生積極影由於泛型,您可以在編譯期間獲得額外的檢查,所以您可以更快地檢測到某些錯誤。

6

是的,它會影響性能,因爲編譯器會創建類型轉換。

例如:

List<String> strings = ... 
String first = strings.get(0); 

將變爲:

List strings; 
String first = (String)string.get(0); 

然而,這並不重要,因爲之前的Java泛型了這解決了同樣的方式。在Java中,泛型只在編譯時確保類型安全。

相關問題