2011-06-03 137 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中,泛型只在编译时确保类型安全。

相关问题