Java 存在两种包的导入机制
- 单类型导入、这个也是推荐并且也是常见常用的
- 按需类型导入、这个是不推荐的、也就是我们常说的 import xxx.xx.*
单类型导入仅仅是导入一个接口或者类、而按需导入也是仅仅导入当前类所需要使用的类、两者的差别只是对类文件的定位算法不一样。
Java 编译器会从启动目录、扩展目录以及用户类路径目录去定位需要导入的类。这三个目录也是我们所说的类的顶级目录。
编译器定位类文件的方法大概如下
顶层路径名(也就是目录) \ 包名\文件名.class
这三者加起来就是一个绝对路径了
因为单类型导入、包名和类名都是确定的、所以可以一次性查找定位
而按需导入因为其包名和类名是不确定、那么就需要组合排列、比如说
package com; import java.util.*; import java.awt.*; public class TestImport { public static void main(String[] args) { List list; } } 复制代码
这个代码中使用到 List 这个类、那么它可能的包名 + 类名就是
- List 属于无包名
- com.List 跟当前的类属于同一个包
- java.lang.List 编译器自动导入 java.lang 包
- java.util.List
- java.awt.List
编译器即使找到 java.util.List 也不会停下来、而是会继续寻找、找出所有的判断是否有类导入冲突
网络异常,图片无法展示
|
如果是一个顶层路径、那么就比单类型导入多出四次查找、如果是两个顶层路径就多出八次
所以按需导入不会影响我们实际运行 class 文件、只是会影响编译的速度
所以综上所述、import * 还是不推荐的。idea 中可以设置、
网络异常,图片无法展示
|
启动优化导入、移除无用的 import
网络异常,图片无法展示
|
- 同一个包下的 xxx 个类自动合并为 import *
- 导入静态类时、达到 xxx 个自动合并为 import static *