不,根本没有区别。
根据The Java Virtual Machine Specifications, Second Edition , Chapter 5: Loading, Linking and Initializing说如下:
Java 虚拟机动态加载(第 2.17.2 节)、链接(第 2.17.3 节)和初始化(第 2.17.4 节)类和接口。加载是查找具有特定名称的类或接口类型的二进制表示并从该二进制表示创建类或接口的过程。链接是获取类或接口并将其组合到 Java 虚拟机的运行时状态以便可以执行的过程。
在编译时,没有类的链接,因此,使用通配符进行import
ing 没有区别。其他类不一起包含在结果class
文件中。
实际上,如果您查看class
文件的字节码(通过javap
或此类反汇编程序),您将找不到任何import
语句,因此在源代码中包含或多或少的import
语句数不会影响class
文件的大小。
这是一个简单的实验:尝试编写一个程序,并import
使用通配符使用 s 进行编译,另一个使用显式导入进行编译。生成的class
文件应该是相同的大小。
在特定类上使用显式import
语句可能不太可读(而且很麻烦,如果不使用会为您编写它的 Eclipse 之类的 IDE),但允许您处理两个包中类名的重叠。
例如,在和包List
中都有一个类。通过导入这两个包,名为 的类将发生冲突:java.util
java.awt
List
import java.util.*;
import java.awt.*;
// ... snip ... //
List l; // which "List" are we talking about?
通过仅导入您需要的特定类,可以在一定程度上避免这些冲突:
import java.util.Hashmap;
import java.awt.List;
// .. snip ... //
List l; // Now we know for sure it's java.awt.List
当然,如果您必须同时使用两者java.util.List
,java.awt.List
那么您就不走运了;您需要明确使用其完全限定的类名。