【问题标题】:Imports in Java [duplicate]Java中的导入[重复]
【发布时间】:2013-08-15 06:20:27
【问题描述】:

我了解到,与 C/C++ 不同,当我们“导入”包时,它们实际上并没有被添加(它们被引用而不是被嵌入)到类文件中。

这会对性能产生什么影响?

我很好奇由于引用的数据(来自包)在 .class 本身中不可用而可能产生的开销(调用引用的包...等)。

或者开销极小?

【问题讨论】:

  • 你提到的线程得出结论,导入在 C/C++ 中的工作方式与 Java 不同。这个我已经知道了
  • 在反编译字节码时,无法确定导入的内容。他们留下的唯一痕迹是行号略高,因此也不会影响性能。
  • 许多来自 C/C++ 的开发人员起初对 Java 感到不安的是,性能不是你 a) 需要担心的事情 b) 是你应该只在运行程序之前测量的东西一个决定,c) 如果事实证明存在问题(这种情况很少见但令人沮丧),Java 被设计为更易于理解为一种语言(尽管 JVM 非常复杂),并且可以消除许多问题在低级语言中您会担心的常见问题。
  • @PeterLawrey 这可能会导致所有那些众所周知的 O(2^n) 算法的性能显着下降,其中 n 是当前堆栈跟踪的行号。
  • @JasonC 没错,像 Big-O 这样的“大局”优化总是很重要,Java 开发人员应该比恕我直言更好地理解。非常低的微调,比如哪些变量在哪些寄存器中,这对 Java 开发人员来说并不重要。

标签: java


【解决方案1】:

没有性能问题。它只影响编译器如何解析类型;对生成的字节码或运行时可用的信息没有影响。它几乎完全等同于 C++ 中的 using [namespace](其中包就像命名空间)。

与 C++ 一样,您也可以使用包来完全限定类型,而不是导入它。

C++:

Something::Whatever x = ...;
// or
using namespace Something;
Whatever x = ...;

Java:

com.something.Whatever x = ...;
// or
import com.something.*;
Whatever x = ...;

您可以(也应该)导入特定类型:

C++:

using Something::Whatever;

Java:

import com.something.Whatever;

与 C++ 一样,同一个包中的类可以相互引用,而无需限定包名。

请注意,与 C++ using namespace 不同,import 必须位于文件顶部。此外,包名直接反映了源相对于类路径的目录结构(路径分隔符被替换为点);因为类可以在 Java 中动态加载,所以包名还指定了类加载器在文件系统中查找类的位置。

另外,为了挑剔,C 中没有这样的概念。

【讨论】:

    【解决方案2】:

    添加包没有性能开销成本。但是你不应该简单地在你的代码中导入不必要的包。有时会有同名的类在不同的包中,这样会遇到不必要的问题。

    从良好的编码实践出发,只使用你需要的东西,没有任何额外的东西是好的。所以导入类而不是完整的包。

    几乎所有 IDE 都带有组织导入的功能,因此您真的不需要记住类的包和完整路径。只需利用 IDE 功能并保持代码干净。

    【讨论】:

    • 我可以知道这里投反对票的原因吗?
    • 我也想知道,这是一个完全有效的答案。
    【解决方案3】:

    Java 类加载器仅在需要时才将类加载到内存中。它不会在导入后将类加载到内存中,请参阅answer. 这没有“性能缺点”...当需要访问类的字节码时,几乎可以肯定会在恒定时间内检索内存中的地址。

    【讨论】:

      【解决方案4】:

      import 没有任何性能开销。至少JLS 没有提到这一点

      导入声明使类型或成员可以通过其简单的 仅在实际包含 进口申报

      【讨论】:

        猜你喜欢
        • 2012-10-18
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-17
        • 2015-05-30
        • 1970-01-01
        • 2014-04-15
        相关资源
        最近更新 更多