当前位置:编程学习 > JAVA >>

一个关于运行时常量池的问题,求指教!

最近在阅读周志明的《深入理解java虚拟机》,“运行时常量池是方法去的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容在类加载后存放在方法区的运行时常量池中。” 引号中的文字是引用的原文,运行时常量池存放了Class文件中常量池的内容,那如果有两个类,包含了相同的常量,编译后生成了两个Class文件,那么在加载完这两个类后,针对这个相同的常量,在常量池中是有一份呢还是有两份呢?
小弟初学,希望前辈给予解答 --------------------编程问答-------------------- 一份, 使用时拿常量池引用。
可以先看看《Java虚拟机规范》,里面有简单介绍。
然后想详细了解就看下深入理解java虚拟机。 --------------------编程问答-------------------- 肯定是一份,常量池就是为了效率设计的,两份那也没必要设计它了 --------------------编程问答-------------------- 只有一份的,而且常量的正式获取方式其实已经改变了。你看到后面就应该明白了。所有常量的引用都是出自同一个类。 --------------------编程问答-------------------- 谢谢楼主,学习!! --------------------编程问答-------------------- 首先,每个类都有一个常量池,同样的常量,如int值5,虽然值相同,在不同的类的常量池里都是存在的

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

LZ看看常量池的类型和常量池解析吧 --------------------编程问答--------------------
引用 5 楼 ticmy 的回复:
首先,每个类都有一个常量池,同样的常量,如int值5,虽然值相同,在不同的类的常量池里都是存在的

String比较特殊,相同的unicode串,虽然每个类的常量池中都有一个CONSTANT_String_info条目,但是在创建这个String对象的时候有不同的地方,每个jvm实例都维护了一个intern列表,这里存的全是String,在解析一个CONSTANT_S……


学习了, --------------------编程问答--------------------
引用 5 楼 ticmy 的回复:
首先,每个类都有一个常量池,同样的常量,如int值5,虽然值相同,在不同的类的常量池里都是存在的

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

LZ看看常量池的类型和常量池解析吧

这个字符串是不是一定要用final修饰?
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,