我想知道在我的Java程序中包含许多import
是否会影响代码的性能(例如,程序会变慢)? Java中import
背后的逻辑与C中的include
相同吗?
导入其他模块,会影响代码的性能吗(比如程序变慢)?
不会影响你代码的性能。
导入其他模块并不是通过任何剪切粘贴的机制来实现的,因此二进制文件(类文件)的大小不会增加。它只是一种语法糖,用于避免需要编写冗长的代码,例如:
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中的import和C语言中的include是相同的逻辑吗?
不,#include
是一个预处理指令,实现了一个剪切和粘贴的机制。
...这会影响我的代码性能吗?
完全不会。实际上,编译后的类(无论是否使用导入)将是相同的。导入只是一种语法糖,允许您在源代码中使用更短的名称引用外部类或(通过静态导入)类成员。换句话说,它允许您编写:
Map map = new HashMap();
而不是
java.util.Map map = new java.util.HashMap();
就这些内容。
在编译时间上可能会有微小的差异。但是,据我所知,例如 import java.util.*;
这样的语句并不会导致编译器加载所有 java.util
的类,而只是将这些类的名字添加到符号表中。
话虽如此:
.*
)可能会导致意外的冲突。Java 中的导入逻辑和 C 中的 include 相同吗?
不相同。
C/C++ 的 include 指令将任意的 C/C++ "代码" 注入到源代码流中。这可以包括声明和可执行语句……它们都可以影响性能、执行内存占用和可执行文件大小。
1 - 也就是说,包含文件的作者选择放入文件中的任何内容。它可以是简单的方法和类“签名”,也可以是宏、代码和其他声明,它们都会产生影响。必须检查文件才能确定。
这不会对程序的运行速度产生任何影响。
这可能会对程序的编译速度产生影响。
如果你import java.util.*;
,它会将整个java.util包加载到编译器中,当你为单个用途.*
导入整个包时,可能会增加编译时间(虽然如果这是一个问题,你应该进行一些分析)。
除了可能存在的编译时间问题外,还要考虑可读性问题。通常我(和我交谈过的人)认为import pack.age.Class;
比import pack.age.*;
更易读 - 当然,在做出决定之前请与你的团队进行讨论。
但它的逻辑与#include
非常不同,不会膨胀代码。当你包含依赖的jar时,你可能会得到比必需更多的内容,但这可能不是一个大问题。
import
不会减慢程序运行速度。最好在不同的packages
中拥有不同类型的classes
,并根据需要进行导入。这将提高代码的可读性。
导入不是问题。您可以从包中导入您想要的所有内容,代码的执行不会变慢。import 是为了方便,以便您可以使用较短的名称。
当隐式或显式地调用它们的构造函数时(new 操作符),类将被加载。在枚举的情况下,当您在代码中引用枚举名称时,它将被加载。(您可以尝试在枚举的私有构造函数中使用 println 进行实验,并查看何时加载枚举)。 加载类需要时间和内存。一般来说,已加载的类不应该被卸载。
.*
),它可能会增加您的代码编译时间。 - corsiKa