Java中的类导入和包导入之间有什么区别吗?
在Java中,我们可以导入单个类以及整个类(包)。
举个例子
import java.util.*
包括
import java.util.ArrayList; import java.util.Date; import java.util.Enumeration; import java.util.HashSet; import java.util.Hashtable; import java.util.List; import java.util.Iterator; import java.util.Map;
除了代码的长度,以任何方式使用每种方法有什么特别的优势吗? 内存分配? 性能?
两者都没有性能或内存分配优势 – 它们都将编译为相同的字节码。
import
语句是告诉编译器在哪里找到源代码所引用的类。
但是,仅按类导入是有利的。 如果在两个包中存在具有完全相同名称的类,则将引发关于引用哪个类的冲突。
一个这样的例子是java.awt.List
类和java.util.List
类。
假设我们想要使用java.awt.Panel
和java.util.List
。 如果源导入包,如下所示:
import java.awt.*; import java.util.*;
然后,参考List
类将是ambigious:
List list; // Which "List" is this from? java.util? java.awt?
但是,如果显式导入,则结果为:
import java.awt.Panel; import java.util.List; List list; // No ambiguity here -- it refers to java.util.List.
您选择使用的导入仅在解析类名时产生编译时差异。
因此,唯一的优点/缺点适用于可读性。
只导入你需要的最小值似乎更好,因为有人可以看看你实际使用的是什么。 也就是说,IDE可能会处理这个问题,这是一个有争议的问题。
在您的应用程序的内存分配或性能方面没有任何区别; import语句在程序运行时根本没有任何影响。 它们只是告诉编译器在哪里(在哪个包中)查找类的指令。
但是,最好避免使用通配符语法并始终使用特定的导入。 这样做可以避免在与程序的未来版本库兼容方面出现问题。
假设您在程序中使用的是某个库的1.0版本,并且您确实import somelibrary.*;
了某些库import somelibrary.*;
。 假设您的程序有一个名为X
的类。 现在,该库的1.1版本出来了,您想要使用它。 假设在库的1.1版本中有一个名为X
的新类。
如果您使用了通配符语法,那么您突然也会从库中导入X
然后编译器会给你一个错误,因为你的程序中已经有了一个类X
,编译器无法区分你的X
和X
如果只从库中导入实际需要的类,则不会出现此问题,因为您不会自动从库的1.1版本导入X
使用’*’导入的优点是代码行数更少,输入更少。 如果您使用“哑”文本编辑器而不是IDE进行编码比使用省略号隐藏导入并且可以半自动添加导入更重要。
使用’*’导入的缺点是:
- 偶尔会遇到输入的类名冲突; 例如,当某个类名用于不同包中的类并且您同时导入它们时。
- 通过查看导入,您无法看到类显式依赖项。 但是,如果您的IDE可以通过其他方式显示依赖关系,那么这一点就不那么重要了。
在编译时执行显式导入更安全,因为不存在类冲突的可能性。 例如
import java.sql.*; import java.util.*;
如果您尝试使用Date类(即从哪个包?)会导致问题。
但除此之外,没有性能或内存方面。 这纯粹是编译时的问题。
任何体面的IDE都会为您提供更多的导入语句。 如果这是一个问题,请获得更好的IDE。
IntelliJ做到了; Eclipse也是如此。 我自己不使用NetBeans,但我敢打赌它确实如此。