Java 导入与代码性能

2022-08-31 19:46:35

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


答案 1

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

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

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

它只是一个语法糖,以避免例如必须写

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


答案 2

...它会影响我的代码的性能吗?

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

    Map map = new HashMap();

而不是

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

仅此而已。

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

话虽如此:

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

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

不,它不是。

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


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