哪个会使Class文件更大? import java.awt。*,还是一堆或单个import语句?

时间:2009-02-25 09:14:15

标签: java class import size

好的,如果我有一个项目使用:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Color;
import java.awt.Polygon;

是否会使Class文件更小:

import java.awt.*

我反对它,因为我输入了很多我不需要的东西。我正在考虑因为它使文件中的字符少得多。

10 个答案:

答案 0 :(得分:17)

没有区别。这些只是一个编译时构造。

答案 1 :(得分:12)

不,没有任何区别。

根据The Java Virtual Machine Specifications, Second EditionChapter 5: Loading, Linking and Initializing说明如下:

  

动态Java虚拟机   加载(§2.17.2),链接(§2.17.3)和   初始化(§2.17.4)类和   接口。加载是过程   找到一个二进制表示   带有a的类或接口类型   特定的名称和创建一个类   或该二进制文件的接口   表示。链接是一个过程   取一个类或接口和   将它组合到运行时状态   这样的Java虚拟机   可以执行。

在编译时,没有类的链接,因此,使用import的通配符没有任何区别。其他类不会包含在生成的class文件中。

事实上,如果你查看class文件的字节码(通过javap或这样的反汇编程序),你将找不到任何import语句,因此或多或少源中import个语句的数量不会影响class文件的大小。

这是一个简单的实验:尝试编写程序,使用通配符编译import,使用显式导入编译另一个。{生成的class文件大小应相同。


在特定类上使用显式import语句可能不太可读(如果不使用像Eclipse这样的IDE会为你编写它,那就麻烦了),但是可以让你处理类的重叠两个包中的名字。

例如,java.utiljava.awt包中都有List个类。通过导入两个包,名为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.Listjava.awt.List那么你就不走运了;你需要明确使用他们的完全限定的类名。

答案 2 :(得分:3)

Java import语句不会向类文件添加任何大小。它允许编译器推导出编译时引用的名称。

行唯一的区别

import java.util.*;

make是你可以写的:

Set<String> set;

而不是:

java.util.Set<String> set;

答案 3 :(得分:2)

老实说,你为什么要关心班级文件的大小?

更好的做法是明确包含所有需要的类而不是“import foo.bar。*”。

这使您的代码更具可读性,更易于维护。

答案 4 :(得分:1)

我认为Java只包含你真正需要的东西......所以使用其中一种方式在最终编译版本中没有任何区别。

答案 5 :(得分:1)

生成的类文件中根本没有变化。

导入只对编译器有影响(如果必须索引很多目录,可能需要更长的时间),当然还有源代码(当你可以确切地看到哪些类时,IMO更易于维护)使用)。

答案 6 :(得分:1)

如果您有兴趣缩小班级规模,the game making competition java4k会有一些提示,例如此页http://www.ahristov.com/tutorial/java4k-tips/java4k-tips.html

答案 7 :(得分:1)

首先,请务必查看我的“按需导入是邪恶的!”文章:

http://javadude.com/articles/importondemandisevil.html

你应该 从不 使用*语法!当代码添加到另一个库时,它可能导致程序停止编译!

现在,这是导入真正起作用的方式:

当你说

import a.b.c.Foo;

所有这一切都告诉编译器当你说“Foo”时,你的意思是“a.b.c.Foo”。然后,编译器将在生成的字节码中用a.b.c.Foo替换所有出现的Foo。

当你说

import a.b.c.*;

这告诉编译器“当你看到一个你不认识的符号XXX时,检查是否有a.b.c.XXX”如果找到,编译器将用生成的字节码中的a.b.c.XXX替换XXX。

如果多个“*”导入与未知符号匹配,则会出现歧义的编译错误。

答案 8 :(得分:0)

之前的帖子中没有任何差异,但是我使用的是偏好 严格导入,因为我发现它在我看来代码更喜欢阅读

答案 9 :(得分:0)

作为对早期答案的补充,您应该看到的唯一区别是,当您明确告诉您想要import编辑的内容时,编译应该更快,而不是给出通配符,可包括数千(数千)不必要的包和类。