String字符串拼接小例
?>>>寫出下面程序運行結(jié)果:
public class StringTest {public static void main(String[] args) {String s1 = "Programming";String a = "Program";String b = "ming";String s2 = "Program" + "ming";String s3 = a + b;System.out.println(s1 == s2);System.out.println(s1 == s3);System.out.println(s1 == s3.intern());} }?>>>輸出結(jié)果為:
true false true>>>解析:
首先,intern()方法會將常量池中對應(yīng)字符串的引用返回,如果常量池沒有這個字符串,則將其添加到常量池,再返回常量池中的這個引用。所以第三個輸出結(jié)果為true。
關(guān)于第一和第二個輸出結(jié)果,可能迷惑性很大,這個我們需要借助于javap反編譯工具來看一下編譯過程:
執(zhí)行 javap -c StringTest.class 命令,查看結(jié)果:
(如果圖片看不清,可以點擊圖片查看原圖)
圖中畫紅框的兩個部分,分別對應(yīng):
String s2 = "Program" + "ming"; String s3 = a + b;可以看到,s2 通過字面量直接拼接的方式并沒有創(chuàng)建StringBuilder對象,但是s3卻創(chuàng)建了一個StringBuilder然后調(diào)用append()方法進行的字符串拼接。
因此,s2的地址在常量池中,s3的地址由于是new 了一個StringBuilder,因此是在堆(Heap)中,這才導(dǎo)致了 s1 == s3 的結(jié)果為 false。
所以,也并不是所有字符串拼接都是先創(chuàng)建一個StringBuilder對象的。這也會在面試題中經(jīng)常被問到,即 “ 什么情況下用+運算符進行字符串連接比調(diào)用StringBuffer/StringBuilder對象的append方法連接字符串性能更好?”,就是在這種不會創(chuàng)建StringBuilder對象的情況下才會比append()性能好。
總結(jié)
以上是生活随笔為你收集整理的String字符串拼接小例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux进阶之路————scp指令介绍
- 下一篇: law是什么的缩写_Lawyer和Att