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.Paneljava.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 ,编译器无法区分你的XX

如果只从库中导入实际需要的类,则不会出现此问题,因为您不会自动从库的1.1版本导入X

使用’*’导入的优点是代码行数更少,输入更少。 如果您使用“哑”文本编辑器而不是IDE进行编码比使用省略号隐藏导入并且可以半自动添加导入更重要。

使用’*’导入的缺点是:

  • 偶尔会遇到输入的类名冲突; 例如,当某个类名用于不同包中的类并且您同时导入它们时。
  • 通过查看导入,您无法看到类显式依赖项。 但是,如果您的IDE可以通过其他方式显示依赖关系,那么这一点就不那么重要了。

在编译时执行显式导入更安全,因为不存在类冲突的可能性。 例如

 import java.sql.*; import java.util.*; 

如果您尝试使用Date类(即从哪个包?)会导致问题。

但除此之外,没有性能或内存方面。 这纯粹是编译时的问题。

任何体面的IDE都会为您提供更多的导入语句。 如果这是一个问题,请获得更好的IDE。

IntelliJ做到了; Eclipse也是如此。 我自己不使用NetBeans,但我敢打赌它确实如此。