我读过与C / C ++不同的东西,当我们" import"他们实际上没有添加的软件包(它们被引用而不是嵌入式)到类文件中。
因此有什么性能影响?
我很好奇可能会因为引用的数据(来自软件包)在.class本身中不可用而导致的开销(调用引用的软件包......等)。
或者开销非常小?
答案 0 :(得分:5)
没有性能命中。它只影响编译器解析类型的方式;对生成的字节代码或运行时可用的信息没有影响。它几乎完全等同于C ++中的using [namespace]
(其中包就像命名空间一样)。
与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中没有这样的概念。
答案 1 :(得分:2)
添加包没有性能开销成本。但是,您不应该只是在代码中导入不必要的包。有时会有相同名称但在不同包中的类,因此您将遇到不必要的问题。
从良好的编码实践中,只使用你需要的东西,没有什么是好的。所以导入类而不是完整的包。
几乎所有的IDE都具有组织导入的功能,因此您实际上不需要记住包和类的完整路径。只需使用IDE功能并保持代码清洁。
答案 2 :(得分:1)
Java类加载器仅在需要时才将类加载到内存中。它不会在导入后将类加载到内存中,请参阅此answer.这没有“性能缺点”......当需要访问类的字节码时,内存中的地址几乎肯定会在恒定时间内被检索。
答案 3 :(得分:1)
import没有任何性能开销。至少JLS没有提到
导入声明通过简单的方式使类型或成员可用 仅在实际包含的编译单元内的名称 进口申报