【问题标题】:Does an unused import declaration eat memory, in Java?在 Java 中,未使用的导入声明会占用内存吗?
【发布时间】:2013-08-11 19:10:27
【问题描述】:

像这样的未使用的导入 - import android.widget.RelativeLayout; 会吃掉内存吗? 只是想知道它有多少或只是有价值? 也许这是个愚蠢的问题,但我还没有找到答案。

【问题讨论】:

标签: java performance import


【解决方案1】:

不,它们不会占用任何内存。导入只是被编译器用来在编译时解析类名。

编译器将每个类名更改为完全限定名。并删除导入语句。所以,import 语句不会变成字节码。

通配符导入的唯一问题是命名空间冲突,即,当在两个不同的包中定义了两个具有相同名称的类型时,使用通配符导入这些包将导致所使用的类型的名称冲突。


要查看编译器如何替换导入语句,您可以使用javap 命令生成类的字节码。考虑下面的代码:

import java.util.*;
import java.util.regex.*;

public class Test {
    public static void main(String[] args) {

    }
}

只需编译上述代码,并使用以下命令检查字节码:

javap Test

它给出以下输出:

public class Test {
  public Test();
  public static void main(java.lang.String[]);
}

因此,您可以看到String 类型被替换为它的完全限定名称java.lang.String,并且字节码中没有导入语句。

【讨论】:

  • 这个答案对我来说很有意义,但我的 Java 项目中遇到的问题似乎与此相矛盾。我可以编译一个类,运行一个可以混淆一些导入及其引用的程序,以使其与其他一些混淆代码一起工作,然后反编译该类并查看一些现在混淆的旧类的导入语句。如果这些类不再在代码中使用,反编译器如何获得这些导入语句?他们不应该在编译中丢失吗? (我应该将此作为新问题发布吗?)
  • 没关系。忘了它。我相信重新混淆器只是做了一半的工作。我相信这就是为什么 import 语句仍然存在的原因。反编译器可能只是为了让它看起来更好而写在那些 import 语句中。
【解决方案2】:

未使用的导入在运行时不会产生影响(因为字节码中没有导入)。但是,未使用的导入会影响编译器,但影响不大。

一般来说,只导入您需要的内容会提高代码的可维护性和可读性。

【讨论】:

    【解决方案3】:

    不,编译器会在编译后删除它们。但是你可能会遇到两个问题

    1. 代码混乱
    2. 如果您从 jar 中导入了一些类,然后删除了 jar 但没有导入,则可能会出现编译时错误

    【讨论】:

      【解决方案4】:

      在运行时没有影响。它可以使编译过程变得非常慢(无法测量)。但就拥有它们而言,最好删除它们,因为它会使文件更小,并且更容易阅读实际使用的导入。

      【讨论】:

      • +1 用于自我记录方面。这一直是我显式导入仅使用的类的主要原因。
      【解决方案5】:

      不会影响任何 rumtime 编译器时间

      但最好的方法是尽可能编写最清晰、最简单的代码,因为这样可以提高代码的可维护性,并有助于确保代码即使在更改后也能正常运行。

      文档:Best Practices for Performance

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-17
        相关资源
        最近更新 更多