欢迎来到天天文库
浏览记录
ID:44101610
大小:20.23 KB
页数:13页
时间:2019-10-18
《通过反编译深入理解JavaString及intern-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、通过反编译深入理解JavaString及intern-编程开发技术通过反编译深入理解JavaString及intern原文出处:liuxiaopeng一、字符串问题字符串在我们平时的编码工作中其实用的非常多,并且用起來也比较简单,所以很少有人对其做特别深入的研究。倒是面试或者笔试的吋候,往往会涉及比较深入和难度大一点的问题。我在招聘的时候也偶尔会问应聘者相关的问题,倒不是说一定要回答的特别正确和深入,通常问这些问题的口的有两个,第一是考察对JAVA基础知识的了解程度,第二是考察应聘者对技术的态度。我们看看以下程序会输出什么结果?如果你能正确的
2、冋答毎一道题,并且清楚其原因,那木文对你就没什么太大的意义。如果冋答不正确或者不是很清楚其原理,那就仔细看看以下的分析,本文应该能帮助你清楚的理解每段程序的结果及输出该结果的深层次原因。代码段一:packagecom.paddx.test,string;publicclassStringTest{publicstaticvoidmeiin(String[]args){Stringstrl="string";Stringstr2=newString(/zstring");Stringstr、3二str、2.intern();System,out
3、・println(strl==str2);//#lSystcm.out・println(stri二二str3);//#2}}代码段二:packagecom.paddx.test,string;publicclassStringTcstOl{publicstaticvoidmain(String[]args){StringbaseStr="baseStr";finalStringbaseFinalStr二,,baseStr,/;Stringstrl=z,bascStr01Stringstr2=〃baseStr"+〃01";Stringstr3=
4、baseStr+〃01〃;Stringstrd二baseFinalStr+〃01〃;Stringstr5二newString(z/baseStr01〃)•intern();System,out.println(strl==str2);//#3System.out.println(strl二二str3);//#4System,out.println(strl二二strd);//#5System.out.println(stri二二str5);//#6}}代码段三(1):packagecom.paddx.test,string;publi
5、cclassInternTest{publicstaticvoidmain(String[]args){Stringstr2=newString(^str^)+newString(〃01〃);str2.intern();Stringstrl二〃str01〃;System,out.println(str2二二stri);//#7}}代码段三(2):packagecom.paddx.test,string;publicclassInternTestOl{publicstaticvoidmain(String[]args){Stringstrl二〃
6、strO1;Stringstr2=newString(z,strz/)+newStxing(〃01〃);str2.intern();System,out.println(str2==strl);//#8}}为了方便描述,我对上述代码的输出结果出#广#8进行了编码,下文中蓝色字体部分即为结果。二、字符串深入分析1、代码段一分析字符串不屈于基本类型,但是可以像基本类型一样,直接通过字而量赋值,当然也可以通过new来生成一个字符串对彖。不过通过字面量赋值的方式和new的方式生成字符串有木质的区别:栈strlstr二newString("abc")A
7、abc通过字面量赋值创建字符串吋,会优先在常量池屮查找是否已经存在相同的字符串,倘若已经存在,栈中的引用直接指向该字符串;倘若不存在,则在常量池中生成一个字符吊,再将栈中的引用指向该字符吊。而通过new的方式创建字符吊时,就直接在堆屮生成一个字符串的对彖(备注,JDK7以后,HotSpot已将常量池从永久代转移到了堆中。详细信息可参考《JDK8内存模型-消失的PermGen»一文),栈中的引用指向该对象。对于堆中的字符串对象,可以通过intern()方法來将字符串添加的常量池中,并返回指向该常量的引用。现在我们应该能很清楚代码段一的结杲了:结
8、果#1:因为strl指向的是字符串中的常量,str2是在堆中生成的对象,所以strl==str2返冋false。结果#2:str2调用intern方法,会将str2
此文档下载收益归作者所有