背景:
看书看到类和类加载器,说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);
}
}
运行结果:
- 先尝试了java.util.*和java.util.List的区别,结果发现打印的一样,而且许多我没有使用的List下的类也打印了,猜测是虚拟机本身用到了这些类了。这样就没有对比了吗
- 然后尝试了Pattern的区别,这次的打印中只出现了代码中使用到的类。而且引入*和引入指定的类,两次加载的类确实是一样的。
那么问题来了,引入*和引入指定的类,到底有什么区别呢?为什么推荐写指定的类呢?
通过度娘了解到:
- 引入*,在编译时,编译器会遍历你引入的那些包,去匹配代码中的对象
- 引入指定的类,编译器能够直接定位到指定类
最终的结论就是:
- 引入*和引入指定的类,对程序运行的效率是没有影响的
- 但是会编译速度
所以还是尽量明确引入指定的类吧!
网友评论