java常量池解析与字符串intern简介-java开发java经验技巧

java常量池解析与字符串intern简介-java开发java经验技巧

ID:30768655

大小:67.55 KB

页数:4页

时间:2019-01-03

java常量池解析与字符串intern简介-java开发java经验技巧_第1页
java常量池解析与字符串intern简介-java开发java经验技巧_第2页
java常量池解析与字符串intern简介-java开发java经验技巧_第3页
java常量池解析与字符串intern简介-java开发java经验技巧_第4页
资源描述:

《java常量池解析与字符串intern简介-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、Java常屋池解析与字符串intern简介-编程开发技术Java常量池解析与字符串intern简介原文出处:iceAeterna在Java应用程序运行时,Java虚拟机会保存一份内部的运行时常量池,它区别于class文件的常量池,是class文件常量池映射到虚拟机中的数据结构。关于class文件常量池的部分可以参考之前的博文实例探索Class文件。1.CONSTANT_Class入口解析数组类的符号解析较为特殊。若是基木类型数组,那么虚拟机将创建该基木类型的新数组类,并创建一个Class实例來代表该类型,数组类的定义类加载器为启动类加载器。若是引用类型的数组,那么在

2、此2而还会进行引用类型的解析,数组类的定义类加载器为引用类型的定义类加载器。非数组类和接口的的解析将经历以下步骤:仃)•加载该类型和其所有的超类型如果该类型在此之前已经装载到了虚拟机的当前命名空间,那么直接使用已经被装载的类型即可,否则由引用的发起类的初始类加载器进行加载。对FI标类型的超类的加载必然是在对当前类型加载完的基础上进行的,因为只冇加载完当前类型,才能从class文件的superclass域找到其直接超类的符号引用,再递归进行解析和加载,直至java.lang.Object类。而在递归返回的过程中,会检查interfaces域以查看实现或扩展了哪些接口,

3、并再次递归遍历对接口的符号引用。(2)・检查访问权限随后是对目标类型的连接和初始化,这样才可以正常使用该类型。前面提到,对口标类型的初始化需要其所有超类都必须进行初始化(超接口不是必须的),并且,曲于已经对具超类进行了加载,所以不必再依赖于自该类向Object类的解析顺序,而是从Object类向该类进行初始化。类型的连接和初始化步骤如2(3)•类型校验(4).类型准备(5).类型解析(可推迟)注意该过程是对被引用类型及具超类的符号引用的解析,因为对于被引用类型的某些符号引用不会立刻用到,故该步骤2前是严格意义上属于发起引用的类型的符号解析的过程。只冇在主动使用被引用

4、类型的这些符号引用所指向的类型时,才会对这些符号引用进行解析,对其所指向的类型进行装载、连接和初始化。(6).类型初始化2.CONSTANT_Fieldref入口解析由于一个类型不会含有其超类型所定义的字段,所以对□标字段的搜索将会从字段所指向的类型开始,从该类型开始搜索,再递归搜索其所实现或扩展的接口,再递归搜索其超类,直至找到目标字段,并会将运行时常量池的该字段入口标记为已解析,并在该常量池的数据上改为对这个字段的直接引用。1.CONSTANTJiethodref入口解析与字段的搜集类似但有所不同,其搜索顺序将从该类型开始,再递归搜索其超类,在递归搜索其所实现或

5、扩展的接口。2.CONSTANT_InterfaceMethodRef入口解析对接口方法的搜索就是从被解析的接口开始,向其超接口递归搜索。3.CONSTANT_String入口解析Java虚拟机会将字符串处理为一个字符串对象加以维护,而虚拟机所维护的就是一张字符串池,它包含所有被”拘留”的字符串对彖的引用。对CONSTANT_String量池的解析首先就要查看字符串池屮该字符串对象的引用是否存在,如果存在则直接把常量池数据解析为该字符串对象的引用,若不存在,那么就需要根据这个字符串序列创建一个字符吊对象,并将其引用加入到字符串池屮,并将常量池数据解析为该引用。也可以

6、使用String对彖的intern对彖来拘留一个字符串(注意并非字符串对象),若该字符串池屮存在对该字符串序列的对象的引用,那么直接返冋该引用即可,否则,将会拘留该字符串,但注意拘留返回的字符串对象引用将不会指向原String对象,因为原String对象位T*Java堆,而字符串池的对象是虚拟机所创建的,由虚拟机所维护。packagecom.ice.intern;publicclassTnternTest{???publicstaticvoidmain(Stringargs[]){???????Stringa=newString(〃123〃);???????Stri

7、ngb=a;???????Stringc二newString(〃123〃);;???????System,out.printin(z,beforeintern:,z);???????System,out.printlnCa=b?:〃+(a==b));???????System,out.printin(,za二c?:〃+(a二二c));???????a=a.intern();???????c=c.intern();???????System,out.printin(,zafterintern/7);???????System,out.print!nCza二b?:"

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。