1. 首页
  2. IT资讯

String 字符串拼接问题,到底什么时候会走 StringBuilder?

“u003Cdivu003Eu003Cpu003E最近在突然想到了String字符串拼接问题,于是做了一个demo测试了一下,到底String类型的字符串在拼接的时候,哪种情况下会走会走StringBulider进行字符串拼接,而哪种情况编译器会对代码进行优化?话不多说,先看demou003Cu002Fpu003Eu003Cpu003E问题u003Cu002Fpu003Eu003Cpu003E案例1u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fe06c964189ad486c8401a67519b6fd1d” img_width=”640″ img_height=”236″ alt=”String 字符串拼接问题,到底什么时候会走 StringBuilder?” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E可以发现,str == str2的结果为false,那么我们在看看下一个例子。u003Cu002Fpu003Eu003Cpu003E案例2u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002Fbbf28a69cc5e41a2a3390e9bcf3382a1″ img_width=”640″ img_height=”223″ alt=”String 字符串拼接问题,到底什么时候会走 StringBuilder?” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E这时候,两个字符串对比的结果为true。u003Cu002Fpu003Eu003Cpu003E探究问题u003Cu002Fpu003Eu003Cpu003E这时候,疑问就来了,为什么结果会不一致呢?利用在cmd窗口输入 javap-cTestDemo.class命令,对字节码文件进行反编译,发现了问题所在?u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002F91598ea55ab7439c9620d394c89836d2″ img_width=”640″ img_height=”476″ alt=”String 字符串拼接问题,到底什么时候会走 StringBuilder?” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E可以看到在案例1中,java代码底层走了StringBuilder,进行字符串拼接,然后调用了StringBuilder的toString方法。u003Cu002Fpu003Eu003Cdiv class=”pgc-img”u003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002F8d513ce9aca14ec09d910f705a2ab1ec” img_width=”640″ img_height=”415″ alt=”String 字符串拼接问题,到底什么时候会走 StringBuilder?” inline=”0″u003Eu003Cp class=”pgc-img-caption”u003Eu003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cpu003E而案例2中,对class文件进行反编译,发现代码出现了一点变化,并没有走StringBuilder进行字符串拼接。u003Cu002Fpu003Eu003Cpu003E总结u003Cu002Fpu003Eu003Colu003Eu003Cli class=”ql-align-justify”u003Eu003Cstrongu003E案例1中u003Cu002Fstrongu003E,通过变量和字符串拼接,java是需要先到内存找变量对应的值,才能进行完成字符串拼接的工作,这种方式java编译器没法优化,只能走 StringBuilder进行拼接字符串,然后调用toString方法,当然返回的结果和常量池中的 111这个字符串的内存地址是u003Cstrongu003E不一样u003Cu002Fstrongu003E的,因此结果为false。u003Cu002Fliu003Eu003Cli class=”ql-align-justify”u003Eu003Cstrongu003E案例2中u003Cu002Fstrongu003E,直接在表达式里写值,java不用根据变量去内存里找对应的值,可以在编译的时候直接对这个表达式进行优化,优化后的表达式从 “111”+”” 直接变成了 “111” ,两个String类型的变量都指向了常量池的111字符串,因此结果为true;u003Cu002Fliu003Eu003Cu002Folu003Eu003Cu002Fdivu003E”

原文始发于:String 字符串拼接问题,到底什么时候会走 StringBuilder?

主题测试文章,只做测试使用。发布者:逗乐男神i,转转请注明出处:http://www.cxybcw.com/26490.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code