其实import了之后没用的话跟JVM啊classloader什么的完全没关系。
import语句只在编译时有效,编译过后不会带到class文件里的。所以import了之后用了的类的信息才会出现在编译出来的class文件里,没用的则不会出现。
有兴趣可以自己动手试试。
- //import java.util.regex.*;
- public class Test {
- public static void main(String[] args) {
- System.out.println("test");
- }
- }
//import java.util.regex.*;
public class Test {
public static void main(String[] args) {
System.out.println("test");
}
}
那行import无论被注释掉还是没有被注释掉,编译出来的class文件的内容都是这样的:(javap -private -s -verbose Test)
- Compiled from "Test.java"
- public class Test extends java.lang.Object
- SourceFile: "Test.java"
- minor version: 0
- major version: 50
- Constant pool:
- const #1 = Method #6.#15; // java/lang/Object."<init>":()V
- const #2 = Field #16.#17; // java/lang/System.out:Ljava/io/PrintStream;
- const #3 = String #18; // test
- const #4 = Method #19.#20; // java/io/PrintStream.println:(Ljava/lang/String;)V
- const #5 = class #21; // Test
- const #6 = class #22; // java/lang/Object
- const #7 = Asciz <init>;
- const #8 = Asciz ()V;
- const #9 = Asciz Code;
- const #10 = Asciz LineNumberTable;
- const #11 = Asciz main;
- const #12 = Asciz ([Ljava/lang/String;)V;
- const #13 = Asciz SourceFile;
- const #14 = Asciz Test.java;
- const #15 = NameAndType #7:#8;// "<init>":()V
- const #16 = class #23; // java/lang/System
- const #17 = NameAndType #24:#25;// out:Ljava/io/PrintStream;
- const #18 = Asciz test;
- const #19 = class #26; // java/io/PrintStream
- const #20 = NameAndType #27:#28;// println:(Ljava/lang/String;)V
- const #21 = Asciz Test;
- const #22 = Asciz java/lang/Object;
- const #23 = Asciz java/lang/System;
- const #24 = Asciz out;
- const #25 = Asciz Ljava/io/PrintStream;;
- const #26 = Asciz java/io/PrintStream;
- const #27 = Asciz println;
- const #28 = Asciz (Ljava/lang/String;)V;
- {
- public Test();
- Signature: ()V
- Code:
- Stack=1, Locals=1, Args_size=1
- 0: aload_0
- 1: invokespecial #1; //Method java/lang/Object."<init>":()V
- 4: return
- LineNumberTable:
- line 3: 0
- public static void main(java.lang.String[]);
- Signature: ([Ljava/lang/String;)V
- Code:
- Stack=2, Locals=1, Args_size=1
- 0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
- 3: ldc #3; //String test
- 5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
- 8: return
- LineNumberTable:
- line 5: 0
- line 6: 8
- }
Compiled from "Test.java"
public class Test extends java.lang.Object
SourceFile: "Test.java"
minor version: 0
major version: 50
Constant pool:
const #1 = Method #6.#15; // java/lang/Object."<init>":()V
const #2 = Field #16.#17; // java/lang/System.out:Ljava/io/PrintStream;
const #3 = String #18; // test
const #4 = Method #19.#20; // java/io/PrintStream.println:(Ljava/lang/String;)V
const #5 = class #21; // Test
const #6 = class #22; // java/lang/Object
const #7 = Asciz <init>;
const #8 = Asciz ()V;
const #9 = Asciz Code;
const #10 = Asciz LineNumberTable;
const #11 = Asciz main;
const #12 = Asciz ([Ljava/lang/String;)V;
const #13 = Asciz SourceFile;
const #14 = Asciz Test.java;
const #15 = NameAndType #7:#8;// "<init>":()V
const #16 = class #23; // java/lang/System
const #17 = NameAndType #24:#25;// out:Ljava/io/PrintStream;
const #18 = Asciz test;
const #19 = class #26; // java/io/PrintStream
const #20 = NameAndType #27:#28;// println:(Ljava/lang/String;)V
const #21 = Asciz Test;
const #22 = Asciz java/lang/Object;
const #23 = Asciz java/lang/System;
const #24 = Asciz out;
const #25 = Asciz Ljava/io/PrintStream;;
const #26 = Asciz java/io/PrintStream;
const #27 = Asciz println;
const #28 = Asciz (Ljava/lang/String;)V;
{
public Test();
Signature: ()V
Code:
Stack=1, Locals=1, Args_size=1
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 3: 0
public static void main(java.lang.String[]);
Signature: ([Ljava/lang/String;)V
Code:
Stack=2, Locals=1, Args_size=1
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3; //String test
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
LineNumberTable:
line 5: 0
line 6: 8
}
所以别在意,import多余的东西不会对运行性能带来影响。JVM根本不知道你import了哪些类,只知道你用了哪些类。
import多余的东西主要带来的影响是污染了当前编译单元(也就是单个Java源代码文件)的命名空间而已,名字冲突的可能性变大了而已。例如说package A里有MyClass,你当前的文件在package B里,也有MyClass,这个时候直接写MyClass就容易有歧义,需要写成完整的A.MyClass或B.MyClass来区分。只是这个问题而已。