我已经读过,与 C/C++ 不同,当我们“导入”包时,它们实际上并没有被添加(它们被引用而不是被嵌入)到类文件中。
这对性能有什么影响?
我很好奇可能产生的开销(调用被引用的包......等),因为引用的数据(来自包)在 .class 本身中不可用。
或者开销极小?
我已经读过,与 C/C++ 不同,当我们“导入”包时,它们实际上并没有被添加(它们被引用而不是被嵌入)到类文件中。
这对性能有什么影响?
我很好奇可能产生的开销(调用被引用的包......等),因为引用的数据(来自包)在 .class 本身中不可用。
或者开销极小?
没有性能问题。它只影响编译器如何解析类型;对生成的字节码或运行时可用的信息没有影响。它几乎完全等同using [namespace]
于 C++(其中包就像命名空间)。
与 C++ 一样,您也可以使用包来完全限定类型,而不是导入它。
C++:
Something::Whatever x = ...;
// or
using namespace Something;
Whatever x = ...;
爪哇:
com.something.Whatever x = ...;
// or
import com.something.*;
Whatever x = ...;
您可以(并且应该)还导入特定类型:
C++:
using Something::Whatever;
爪哇:
import com.something.Whatever;
与 C++ 一样,同一个包中的类可以相互引用,而无需限定包名。
请注意,与 C++ 不同using namespace
,它import
必须位于文件的顶部。此外,包名直接反映了源相对于类路径的目录结构(路径分隔符被替换为点);因为类可以在 Java 中动态加载,所以包名还指定了类加载器在文件系统中查找类的位置。
此外,为了挑剔,C 中没有这样的概念。
添加包没有性能开销成本。但是您不应该简单地在代码中导入不必要的包。有时有同名的类,但在不同的包中,所以你会遇到不必要的问题。
从良好的编码实践出发,只使用你需要的东西,没有什么是好的。所以导入类而不是完整的包。
几乎所有的 IDE 都带有一个功能来组织你的导入,所以你真的不需要记住类的包和完整的路径。只需利用 IDE 功能并保持代码干净。
Java 类加载器仅在需要时才将类加载到内存中。导入后它不会将类加载到内存中,请参阅此答案。这没有“性能缺点”......当需要访问类的字节码时,几乎可以肯定会在恒定时间内检索内存中的地址。
import 没有任何性能开销。至少JLS没有提到这一点
导入声明使类型或成员仅在实际包含导入声明的编译单元中通过其简单名称可用