今天公司有个同事,说泛型影响性能,不用泛型的话,性能高七倍,对此,我深表怀疑,于是自己动手,测试了一下,测试并不严谨,大家见谅
测试代码如下,为了防止java虚拟机对foreach或者对迭代器有特殊优化,所以采用最原始的for循环,同时为了防止基本类型拆装箱影响测试结果,采用了我项目里一个很简单的bean。
这个是有泛型的类:
package com.test;
import java.util.ArrayList;
import java.util.List;
import com.mobcent.aca.domain.DeveloperApp;
public class GenericTest implements Runnable {
Thread thread = new Thread(this);
public void start() {
thread.start();
}
public void run() {
// TODO Auto-generated method stub
double total = 0;
for (int i = 0; i < 10000; i++)
total = total + Generic();
System.out.println("Generic: " + total + " ms");
}
public long Generic() {
long start = System.currentTimeMillis();
List<DeveloperApp> v = new ArrayList<DeveloperApp>();
for (int i = 0; i < 10240; i++) {
v.add(new DeveloperApp());
}
for (int i = 0; i < 10240; i++) {
DeveloperApp j = v.get(i);
}
long end = System.currentTimeMillis();
return end - start;
}
}
这个是没有泛型的类package com.test;
import java.util.ArrayList;
import java.util.List;
import com.mobcent.aca.domain.DeveloperApp;
public class NonGenericTest implements Runnable {
Thread thread = new Thread(this);
public void start() {
thread.start();
}
public void run() {
// TODO Auto-generated method stub
double total = 0;
for (int i = 0; i < 10000; i++)
total = total + NonGeneric();
System.out.println("NonGeneric: " + total + " ms");
}
public long NonGeneric() {
long start = System.currentTimeMillis();
List v = new ArrayList();
for (int i = 0; i < 10240; i++) {
v.add(new DeveloperApp());
}
for (int i = 0; i < 10240; i++) {
DeveloperApp j = (DeveloperApp) v.get(i);
}
long end = System.currentTimeMillis();
return end - start;
}
}
以下是测试结果
有泛型 |
无泛型 |
4595.0 ms |
4664.0 ms |
4539.0 ms |
4567.0 ms |
4570.0 ms |
4513.0 ms |
然后还测试了以下同时两个线程的情况,进行对比:
无泛型 |
无泛型 |
9233.0 ms |
9372.0 ms |
9237.0 ms |
9420.0 ms |
9338.0 ms |
9428.0 ms |
我的测试不是很严谨,随手做的小测试。
至于原因,我想大家应该大部分都知道。泛型仅仅是java的语法糖,它不会影响java虚拟机生成的汇编代码,在编译阶段,虚拟机就会把泛型的类型擦除,还原成没有泛型的代码,所以网上说java用泛型比不用泛型速度慢7倍纯属无稽之谈,顶多编译速度稍微慢一些,执行速度是完全没有什么区别的.
分享到:
相关推荐
* 潜在的性能收益:泛型为较大的优化带来可能。 使用泛型与不使用泛型的比较: * 不使用泛型:ArrayList al1=new ArrayList(); al1.add(new Integer(10)); Integer i1=(Integer)al1.get(0); // 这里必须做强制类型...
C#的泛型在类型检查和性能方面可能更胜一筹,而Java的泛型则在类型擦除和向后兼容性上有其独特之处。选择哪种语言的泛型取决于具体项目的需求和开发环境。了解并熟练掌握这两种语言的泛型特性,对于提升开发效率和...
Java泛型是Java语言中用于处理类型安全的一种机制,它允许在编译期间提供类型检查,并在运行时消除了类型转换。Java泛型深入的内容涵盖泛型的基本概念、泛型类、接口、方法以及泛型的使用限制和高级特性。 首先,...
还有类型擦除,这是Java泛型的一个特性,意味着在运行时,所有的泛型信息都会被移除,因此泛型并不影响程序的性能,但它提供了编译时的类型检查。 在集合框架中,泛型发挥了重要作用。Java的List、Set、Map等集合类...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入。泛型允许程序员在代码中使用类型参数,从而增加了代码的类型安全性和重用性。它能够帮助我们避免在运行时出现ClassCastException...
Java 泛型是一种强大的语言特性,它允许在类、接口和方法中使用类型参数,以实现类型的安全性和代码的重用性。泛型是 Java 从 JDK 5.0 版本开始引入的重要特性,目的是增强类型系统,提高程序的类型安全性,减少运行...
总之,Java泛型通过类型检查和类型安全提供了更强大、更安全的代码。类型擦除确保了运行时性能不会因泛型而受到影响,而通配符则提供了处理不确定类型的能力。理解并有效利用这些概念对于编写高效、健壮的Java代码至...
Java泛型与容器详细笔记涉及到Java编程语言中的两个重要概念:泛型(Generics)和容器(Containers)。容器主要包括Java集合框架中的各类集合类,如List、Set、Map等,它们用于存储和操作数据。泛型则提供了一种类型...
Java泛型通配符是Java编程语言中一个重要的特性,它允许我们在定义泛型类型时使用问号(?)作为占位符,表示任意类型的参数。这种通配符的使用大大提高了代码的灵活性和可复用性,同时也帮助开发者遵循强类型检查的...
Java泛型是Java编程语言中的一个重要特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的类型安全性和可复用性。本文旨在深入解析Java泛型的各个方面,帮助开发者形成全面、清晰的理解。 1. **泛型基础*...
Java泛型与集合是Java编程中的核心概念,它们在实际开发中扮演着至关重要的角色。本书"Java Generics and Collections"深入探讨了这两个主题,帮助开发者编写更安全、更高效且可维护的代码。 首先,让我们来理解...
泛型则是Java 5引入的一项重要特性,它增强了类型安全性和代码可读性,避免了运行时的类型转换异常。 在这个"学士后Java集合框架和泛型课后习题答案"中,我们可以深入理解以下几个关键知识点: 1. **集合接口**:...
### Java中的泛型 #### 什么是泛型? 泛型是Java SE 5.0中引入的一项新特性,它允许在程序设计中使用参数化类型,从而实现类型安全的集合类和其他容器类。在使用泛型之前,Java程序员通常依赖于Object类型作为通用...
泛型引入的主要目的是在编译时期检查类型安全,并且在运行时提供更好的性能。在类定义中使用尖括号()来声明类型参数,例如: ```java public class Container<T> { private T item; public void set(T item) ...
3. **潜在的性能收益**:虽然Java泛型的初始实现并未直接提升运行时性能,但其为编译器提供了更多的类型信息,为未来JVM的优化提供了可能性。例如,编译器可能能够更有效地处理泛型代码,减少运行时的检查。 4. **...
在Java编程语言中,泛型是一种强大的特性,它允许我们在类、接口和方法中使用类型参数,从而提高代码的灵活性和可复用性。当我们谈论“java带两个类型参数的泛型”时,这意味着我们正在处理一个泛型类或泛型方法,...
本文将深入探讨Java泛型的基本概念、好处以及与继承的关系。 首先,让我们理解泛型是如何工作的。在Java中,泛型通过对类型系统进行扩展实现,允许我们创建可以接受不同类型参数的类、接口和方法。类型参数,用尖...