完整包导入.*和指定类导入java之间的区别? [复制]

Posted

技术标签:

【中文标题】完整包导入.*和指定类导入java之间的区别? [复制]【英文标题】:Difference between complete package import .* and specified class import java? [duplicate] 【发布时间】:2012-01-14 03:36:15 【问题描述】:

可能重复:Why is using a wild card with a Java import statement bad?

例如。 1

import javax.swing.*

JFrame f = new JFrame()

例如。 2

import javax.swing.JFrame

JFrame f = new JFrame()

在适应 2) 而不是 1) 时是否有任何效率提升(即使是最轻微和最小的)? java如何在内部引用包?

编译器第一次遇到JFrame这个词时,我认为它应该在完全摆动的情况下搜索JFrame。*包在1)的情况下..否则如果在2)的情况下,它可能会抓住这个类直接通过一些索引或者可能是键值散列?那么,即使它很小,为什么不被认为是效率提升呢? (如果我对内部的假设是错误的,请纠正我)

编辑:

抱歉重复了。回复Why is using a wild card with a Java import statement bad?

【问题讨论】:

正如关于 SO 的众多答案之一所述,它会使您的本地命名空间 (***.com/questions/147454/…) 变得混乱。 【参考方案1】:

第一个会在编译时加载包中的所有类

Ex : 1

import javax.swing.*

JFrame f = new JFrame()

第二个将只加载编译时指定的类

Ex: 2

import javax.swing.JFrame

JFrame f = new JFrame()

如果使用第一种方法会增加编译时间

【讨论】:

我也认为编译时间增加的可能性很小,但是使用 javax.swing.JFrame 或 javax.swing.* (以及其他几个通配符导入)进行编译测试我不能获取任何具有统计意义的数据。【参考方案2】:

是的。

import javax.swing.*

导入此包中的所有类。

import javax.swing.JFrame

仅导入 JFrame 类。

我建议导入具体的类。 问候!

【讨论】:

这根本不应该影响性能(也许它扩大了编译器搜索所需的命名空间,因此编译可能需要稍长一些)。这只是为了方便。 我可能不正确,但我相信这只会将名称导入您的命名空间。编译器将其用于构建时名称解析。在运行时,完整的类名包含在您的.class 文件中,无论如何,并且仅用于那些实际使用的类。因此,虽然在软件维护偏好方面存在问题,以及明显的命名空间“混乱”,但它对最终的二进制文件应该没有影响。 我认为它对性能没有任何影响。【参考方案3】:

正如其他人所说,它在编译时存在性能问题(考虑到当前计算机的处理能力,可能不是很重要)。即,导入 * 使编译器需要查看整个包,而导入特定类允许编译器直接获取它。但它不会在运行时造成任何性能问题,因为编译后所有类都会被编译器正确链接。

它也与可读性有关。如果我们import javax.swing.*,我们将很难从包javax.swing 中知道正在使用哪些类。我们需要阅读程序才能找到它。但是,如果我们导入特定的类,如import javax.swing.JFrame,它将帮助读者理解只有指定的类是从外部包中使用的。在这里我们知道只使用了javax.swing包中的JFrame,而无需阅读整个程序。即,可以通过查看导入部分轻松找到我们程序所需的依赖项。

另一个问题是您可能会遇到命名冲突。例如,如果您执行两次导入 import com.abc.*import com.xyz.*。现在,假设两个包都包含一个名为SomeClass 的类。然后,它使编译器陷入了不知道要导入哪个SomeClass的情况,从而导致编译时错误。

【讨论】:

【参考方案4】:

星号只是一种方便,因此您作为程序员不必编写大量的导入语句。星号符号将包含特定包的所有类作为编译候选。

请注意,在大多数情况下,最好是具体的,因为它会清楚地表达您的意图。此外,现代 IDE 会为您执行繁琐的导入语句。所以在某种程度上你可以认为星号表示法已经过时了。

【讨论】:

【参考方案5】:

除了 Ex.2 更明确、更清晰之外,它也更稳定/兼容。

例如考虑

import java.awt.*;
import java.util.*;

...

List list;

在收集前的日子里。如果您使用具有集合的 jdk 版本运行相同的代码,编译器会报错,因为它不知道要使用哪个 List。

正如其他人所说,IDE 将帮助您组织导入语句。

【讨论】:

【参考方案6】:

使用 import javax.swing.* 不会造成运行时损失 并在 Java 中导入 javax.swing.JFrame。唯一不同的是在编译时,import package.*会搜索整个包来找到正确的类信息。

Single-Type-Import(例如,import javax.swing.JFrame)增加了程序的可读性,并且使用了哪些类会非常清楚。

按需类型导入(例如 import javax.swing.*)使包 javax.swing 中声明的所有公共类型的简单名称在编译单元的类和接口声明中可用。

【讨论】:

以上是关于完整包导入.*和指定类导入java之间的区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java Day 12

Java笔记:包与接口

导入jar包,main函数

导入 module 和导入模块之间的区别 [重复]

java,导入httpClient包postMethod如何向指定网页传入账号密码,并且获得跳转后页面的url?

android 导入第三方jar包,在程序中导入包中的类无效;