Java导入与代码性能

时间:2011-02-26 06:12:22

标签: java import

我想知道我是否在我的java程序中包含了很多import,它是否会影响我的代码的性能(例如,程序会变慢)? Java中的import背后的逻辑是否与C中的include相同?

5 个答案:

答案 0 :(得分:65)

  

是否会影响我的代码的性能(例如,程序会变慢)?

不,它不会影响代码的性能。

二进制文件(类文件)的大小不会增加,因为使用任何剪切和粘贴机制都无法实现导入

它只是一个避免必须编写例如

的语法糖
java.util.List<java.math.BigInteger> myList =
        new java.util.ArrayList<java.math.BigInteger>();

这是一个小小的测试,证明了这一点:

aioobe@e6510:~/tmp$ cat Test.java 
import java.util.*;

public class Test {
    public static void main(String[] args) {
        List<Integer> myInts = new ArrayList<Integer>();
    }
}
aioobe@e6510:~/tmp$ javac Test.java
aioobe@e6510:~/tmp$ md5sum Test.class 
523036e294b17377b4078ea1cb8e7940  Test.class

(修改Test.java

aioobe@e6510:~/tmp$ cat Test.java 


public class Test {
    public static void main(String[] args) {
        java.util.List<Integer> myInts = new java.util.ArrayList<Integer>();
    }
}
aioobe@e6510:~/tmp$ javac Test.java
aioobe@e6510:~/tmp$ md5sum Test.class 
523036e294b17377b4078ea1cb8e7940  Test.class
  

Java中的导入背后的逻辑是否与C中的包含相同?

不,#include是预处理程序指令,使用剪切和粘贴机制实现。

答案 1 :(得分:21)

  

...会影响我的代码

的性能吗?

没有丝毫。实际上,编译的类(使用或不使用)将是相同的。导入只是语法糖,允许您在源代码中使用较短的名称作为外部类或(使用静态导入)类成员。换句话说,它允许你写:

    Map map = new HashMap();

而不是

    java.util.Map map = new java.util.HashMap();

就是这样。

编译时间可能存在很小的(微小的)差异。但是,像import java.util.*;之类的AFAIK并不会导致编译器加载所有java.util类。相反,它只是将类的名称添加到符号表中。

说完了:

  • 不必要的导入是一个坏主意,因为它们会使代码混乱,并可能误导读取代码的人。
  • 通配符导入(.*)可能会导致意外冲突。
  • 很多人(包括我自己)不喜欢通配符导入,因为他们更喜欢看到所使用的实际类的列表。
  

Java中导入的逻辑与C中的包含相同吗?

不,不是。

C / C ++ include指令将任意 1 C / C ++“代码”注入源流。这可能包括声明和可执行语句......这可能会影响性能,执行内存占用量和可执行文件的大小。


1 - 也就是说,无论include文件的作者选择放入文件中。它可以是简单的方法和类“签名”,但也可能是宏,代码和其他有影响的声明。您必须检查文件以确定。

答案 2 :(得分:11)

它对您程序的〜运行〜时间速度没有影响。

它可能会影响您程序的 ~compat_time speed

如果你import java.util.*;它会将所有java.util包加载到编译器中,这可能会增加你.*整个包用于单次使用的编译时间(尽管你应该执行一些分析是否会成为一个问题。)

除了潜在的编译时间问题外,不要忘记考虑可读性问题。一般来说,我(和我谈过的人)发现import pack.age.Class;import pack.age.*;更具可读性 - 在做出决定之前,请与您的团队进行交流。

但它背后的逻辑与#include非常不同,并且不会使代码膨胀。

可能不是一个大问题,你可能会因为包含依赖性jar而不必要

答案 3 :(得分:2)

import不会减慢您的计划速度。最好在不同的classes中使用不同类型的packages,并根据需要导入它们。提高代码可读性。

答案 4 :(得分:0)

导入不是问题。 您可以从包中导入所需的所有内容,并且代码的执行不会变慢。 导入是为了方便,因此您可以使用较短的名称。

当隐式或显式调用构造函数时,会加载类( new 运算符)。在枚举的情况下,当您在代码中引用枚举名称时。这将导致加载class(枚举)。 (您可以尝试在枚举的私有构造函数中使用println进行实验,并查看枚举何时加载)。 加载类需要时间和内存。一般来说,加载的类不是要卸载的。