哪个会使类文件变大?导入java.awt.*,还是一组或单个导入语句?

哪个会使类文件变大?导入java.awt.*,还是一组或单个导入语句?,java,class,import,size,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; 它是否会使类文件更小,以便使用: import java.awt.* 我反对它,因为我进口了很多我不需要的东西。我在考虑它,因为它使文件的字符数大大减少。我认为Ja

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

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Color;
import java.awt.Polygon;
它是否会使类文件更小,以便使用:

import java.awt.*

我反对它,因为我进口了很多我不需要的东西。我在考虑它,因为它使文件的字符数大大减少。

我认为Java只包含您真正需要的东西。。。因此,使用这种或那种方式在最终编译版本中不会有任何区别。

老实说,为什么您关心类文件的大小

更好的做法是显式地包含所需的所有类,而不是执行“import foo.bar.*”


这使您的代码更具可读性和可维护性。

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

生成的类文件中没有任何更改


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

Java
import
语句不会给类文件添加任何大小。它允许编译器在编译时推断出名称所指的内容

唯一不同的是这条线

import java.util.*;
这意味着你可以写:

Set<String> set;
Set;
而不是:

java.util.Set<String> set;
java.util.Set;

不,根本没有区别

据报道,他说:

Java虚拟机的动态特性 荷载(§2.17.2)、连接(§2.17.3)和 初始化(§2.17.4)类和 接口。加载是一个加载过程 求一个函数的二进制表示 具有 特定名称和创建类 或从该二进制文件的接口 代表性。链接是一个过程 获取一个类或接口,以及 将其合并到的运行时状态 Java虚拟机使它 可以执行

在编译时,没有类的链接,因此,为
import
ing使用通配符没有什么区别。其他类不会一起包含在生成的
文件中

事实上,如果您查看
文件的字节码(通过或类似的反汇编程序),您将找不到任何
导入
语句,因此在源代码中有更多或更少的
导入
语句不会影响
文件的大小

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


在特定类上使用显式的
import
语句可能可读性较低(如果不使用Eclipse之类的IDE为您编写,那么可能会很麻烦),但这将允许您处理两个包中类名的重叠

例如,在和包中都有一个
列表
类。通过导入两个包,名为
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
,那么您就不走运了;您需要显式地使用它们的完全限定类名。

与前面的文章中所述没有区别,但是作为首选项,我使用
严格导入我认为,在我看来,代码更易于阅读,这是对前面答案的补充,您应该看到的唯一区别是编译应该更快一点,当您明确地告诉您想要导入的内容时,而不是给出一个通配符,它可以包含数千个(上千个)不必要的包和类。

如果您对减小类的大小感兴趣,这里有一些提示,例如,本页

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

你应该永远不要使用*语法!当代码被添加到另一个库中时,它会导致程序停止编译

下面介绍导入的实际工作原理:

当你说

import a.b.c.Foo;
import a.b.c.*;
所有这些只是告诉编译器,当你说“Foo”时,你真正的意思是“a.b.c.Foo”。然后,编译器将在生成的字节码中将所有出现的Foo替换为a.b.c.Foo

当你说

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


如果有多个“*”导入与未知符号匹配,则会因歧义而导致编译器错误。

这会让许多从C/C++迁移到Java的人感到困惑。有些应用程序有大小限制。