sarstime77 2009-03-05 12:27
浏览 277
已采纳

class 中有些不被使用的import packages. 这些packages会有什么影响?

在java class 中有些没被使用过的import packages. 这些packages会对性能有什么影响么?
这些没被使用的package会被classloader load么?谢谢!

  • 写回答

2条回答 默认 最新

  • rednaxelafx 2009-03-05 13:51
    关注

    其实import了之后没用的话跟JVM啊classloader什么的完全没关系。
    import语句只在编译时有效,编译过后不会带到class文件里的。所以import了之后用了的类的信息才会出现在编译出来的class文件里,没用的则不会出现。

    有兴趣可以自己动手试试。
    [code="java"]//import java.util.regex.*;

    public class Test {
    public static void main(String[] args) {
    System.out.println("test");
    }
    }[/code]

    那行import无论被注释掉还是没有被注释掉,编译出来的class文件的内容都是这样的:(javap -private -s -verbose Test)
    [code]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."":()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 ;
    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;// "":()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."":()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

    }[/code]

    所以别在意,import多余的东西不会对运行性能带来影响。JVM根本不知道你import了哪些类,只知道你用了哪些类。

    import多余的东西主要带来的影响是污染了当前编译单元(也就是单个Java源代码文件)的命名空间而已,名字冲突的可能性变大了而已。例如说package A里有MyClass,你当前的文件在package B里,也有MyClass,这个时候直接写MyClass就容易有歧义,需要写成完整的A.MyClass或B.MyClass来区分。只是这个问题而已。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型