如果我使用完全限定名称访问包中的类而不导入它,是否可以保存任何内存?
使用完全限定的类名:
java.lang.Math.sqrt(x);
导入包:
import java.lang.Math;
Math.sqrt(x);
这是更好的方法:使用完全限定名称导入包或访问?
感谢你......
答案 0 :(得分:10)
导入包或使用完全限定的类名之间没有性能差异。 import指令未转换为Java字节代码,因此对运行时性能没有影响。唯一的区别是它可以节省您的时间,以防您多次使用导入的类。这是一本很好的阅读here
答案 1 :(得分:7)
不,它不能挽救你的记忆。
另请注意,您根本不必导入Math
。 java.lang
中的所有内容都会自动导入。
一个更好的例子就像是ArrayList
import java.util.ArrayList;
....
ArrayList<String> i = new ArrayList<String>();
注意我是专门导入ArrayList
的。我本可以做到
import java.util.*;
但是您通常希望避免使用大型通配符导入以避免包之间发生冲突。
答案 2 :(得分:4)
他们是等同的。访问是相同的。
导入只是一种约定,可以使您不必每次都输入完全解析的类名。只要你是一个快速触摸的人,你就可以在不使用导入的情况下编写所有Java。
但效率或类加载没有区别。
答案 3 :(得分:2)
如前所述,在运行时没有区别(在类文件中它始终是完全限定的,并且在加载和链接类之后有指向被引用方法的直接指针),以及java.lang
中的所有内容自动导入包,就像当前包中的所有内容一样。
编译器可能需要更长时间搜索几微秒,但这不应成为理由 - 决定人类读者的易读性。
顺便说一下,如果你使用了很多静态方法(例如来自Math
),你也可以写
import static java.lang.Math.*;
然后使用
sqrt(x)
直接。但是,只有当你的类很重,并且它确实有助于更大的公式的可读性时才这样做,因为读者(作为编译器)首先会在同一个类中搜索,也可能在超类中搜索。 (这同样适用于其他静态方法和静态变量(或常量)。)
答案 4 :(得分:0)
导入包是为了更好的可读性;
必须在特殊情况下使用完全限定类。例如,不同包中的相同类名,或使用反映,如Class.forName()
。