我想知道我是否在我的java程序中包含了很多import
,它是否会影响我的代码的性能(例如,程序会变慢)? Java中的import
背后的逻辑是否与C中的include
相同?
答案 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
非常不同,并且不会使代码膨胀。
答案 3 :(得分:2)
import
不会减慢您的计划速度。最好在不同的classes
中使用不同类型的packages
,并根据需要导入它们。提高代码可读性。
答案 4 :(得分:0)
导入不是问题。 您可以从包中导入所需的所有内容,并且代码的执行不会变慢。 导入是为了方便,因此您可以使用较短的名称。
当隐式或显式调用构造函数时,会加载类( new 运算符)。在枚举的情况下,当您在代码中引用枚举名称时。这将导致加载class(枚举)。 (您可以尝试在枚举的私有构造函数中使用println进行实验,并查看枚举何时加载)。 加载类需要时间和内存。一般来说,加载的类不是要卸载的。