在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;
除了代码的长度之外,以任何方式使用每种方法有什么特别的优势吗?内存分配?性能?
答案 0 :(得分:26)
两者都没有性能或内存分配优势 - 它们都将编译为相同的字节码。
import
语句是告诉编译器在哪里找到源代码所引用的类。
但是,仅按类导入是有利的。如果在两个包中存在一个具有完全相同名称的类,则会引起关于引用哪个类的冲突。
一个这样的例子是java.awt.List
类和java.util.List
类。
假设我们想要使用java.awt.Panel
和java.util.List
。如果源导入包如下:
import java.awt.*;
import java.util.*;
然后,提到List
类将会变得暧昧:
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.
答案 1 :(得分:6)
您选择使用的导入仅在解析类名时产生编译时差异。
所以唯一的优点/缺点适用于可读性。
只导入您需要的最低值似乎更好,因为有人可以查看您实际使用的内容。也就是说,IDE可能会处理这个问题,这是一个没有实际意义的问题。
答案 2 :(得分:2)
应用程序的内存分配或性能完全没有差别; import语句在程序运行时根本没有任何影响。它们只是指示编译器在哪里(在哪些包中)查找类。
但是,最好避免使用通配符语法并始终使用特定的导入。这样做可以避免在与程序的未来版本库兼容方面出现问题。
假设您在程序中使用某个库的1.0版,并执行import somelibrary.*;
。假设您的程序有一个名为X
的类。现在,该库的1.1版本出来了,您想要使用它。假设在库的1.1版本中有一个名为X
的新类。
如果您使用了通配符语法,则突然也会从库中导入X
。然后编译器会给你一个错误,因为你的程序中已经有一个类X
,编译器无法从库中区分你的X
和X
。
如果您只从库中导入实际需要的类,则不会出现此问题,因为您不会从库的1.1版本自动导入X
。
答案 3 :(得分:2)
在编译时执行显式导入更安全,因为不存在类冲突的可能性。 e.g。
import java.sql.*;
import java.util.*;
如果您尝试使用Date类(即从哪个包?),会导致问题。
但除此之外,没有性能或内存方面。这纯粹是一个编译时问题。
答案 4 :(得分:2)
使用'*'导入的优点是代码行数更少,输入更少。如果您使用“哑”文本编辑器而不是IDE进行编码比使用省略号隐藏导入并且可以半自动添加导入更为重要。
使用'*'导入的缺点是:
答案 5 :(得分:0)
任何体面的IDE都会为您提供更多的导入语句。如果这是一个问题,请获得更好的IDE。
IntelliJ做到了; Eclipse也是如此。我自己不使用NetBeans,但我敢打赌它确实如此。