最近在阅读周志明的《深入理解java虚拟机》,“运行时常量池是方法去的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容在类加载后存放在方法区的运行时常量池中。” 引号中的文字是引用的原文,运行时常量池存放了Class文件中常量池的内容,那如果有两个类,包含了相同的常量,编译后生成了两个Class文件,那么在加载完这两个类后,针对这个相同的常量,在常量池中是有一份呢还是有两份呢?
小弟初学,希望前辈给予解答

解决方案 »

  1.   

    一份, 使用时拿常量池引用。
    可以先看看《Java虚拟机规范》,里面有简单介绍。
    然后想详细了解就看下深入理解java虚拟机。
      

  2.   

    首先,每个类都有一个常量池,同样的常量,如int值5,虽然值相同,在不同的类的常量池里都是存在的String比较特殊,相同的unicode串,虽然每个类的常量池中都有一个CONSTANT_String_info条目,但是在创建这个String对象的时候有不同的地方,每个jvm实例都维护了一个intern列表,这里存的全是String,在解析一个CONSTANT_String_info常量池条目时,会先去intern列表中找找有没有unicode串相同的String对象,如果存在,就将intern列表中的这个对象引用放到原先的那个常量池条目中,下一次访问时就可以直接找到对象了;如果不存在,就要创建一个String对象,并将其加到intern列表,还要放到常量池这个条目中LZ看看常量池的类型和常量池解析吧
      

  3.   

    这个字符串是不是一定要用final修饰?