[JAVA]探究java的import

2019-01-06  本文已影响0人  水木桶

背景:

看书看到类和类加载器,说jvm是按需加载类的,只有明确使用的类才会被加载,具体加载了哪些?可以通过在启动参数上添加-verbose:class来看。
想到了很久以前接触到的,说引入类时尽量标明具体的类,比如import java.util.regex.Pattern,而不是import java.util.regex.*,当时也没太注意为什么这么写,于是就尝试一下。

代码如下:

import java.util.List;
import java.util.ArrayList;
//import java.util.regex.Pattern;
public class TestImport {
    public static void main(String[] args) {
        System.out.println("Hello");
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        System.out.println(list);
        //Pattern p = Pattern.compile("a*b");
        //System.out.println(p);
    }

}

运行结果:

  1. 先尝试了java.util.*和java.util.List的区别,结果发现打印的一样,而且许多我没有使用的List下的类也打印了,猜测是虚拟机本身用到了这些类了。这样就没有对比了吗
  2. 然后尝试了Pattern的区别,这次的打印中只出现了代码中使用到的类。而且引入*和引入指定的类,两次加载的类确实是一样的。

那么问题来了,引入*和引入指定的类,到底有什么区别呢?为什么推荐写指定的类呢?

通过度娘了解到:

  1. 引入*,在编译时,编译器会遍历你引入的那些包,去匹配代码中的对象
  2. 引入指定的类,编译器能够直接定位到指定类

最终的结论就是:

  1. 引入*和引入指定的类,对程序运行的效率是没有影响的
  2. 但是会编译速度
    所以还是尽量明确引入指定的类吧!
上一篇下一篇

猜你喜欢

热点阅读