???????
????String???????Java???????÷?????????????????????????е????????????д???????????????????JDK?汾?1.8.0_3??
??????????
????Java?????????class??????????????????????Constant pool?????????????????????泣???????????????????????????????????????????
????package com.ctrip.ttd.whywhy;
????public class Test {
????public static void main(String[] args) {
????String test = "test";
????}
????}
???????????δ?????????? javap -verbose ??class????? Constant pool ????
????Constant pool:
????#1 = Methodref          #4.#13         // java/lang/Object."<init>":()V
????#2 = String             #14            // test
????#3 = Class              #15            // com/ctrip/ttd/whywhy/test
????#4 = Class              #16            // java/lang/Object
????#5 = Utf8               <init>
????#6 = Utf8               ()V
????#7 = Utf8               Code
????#8 = Utf8               LineNumberTable
????#9 = Utf8               main
????#10 = Utf8               ([Ljava/lang/String;)V
????#11 = Utf8               SourceFile
????#12 = Utf8               test.java
????#13 = NameAndType        #5:#6          // "<init>":()V
????#14 = Utf8               test
????#15 = Utf8               com/ctrip/ttd/whywhy/test
????#16 = Utf8               java/lang/Object
?????????????????????????????????? "test" ????????е???巽???
????#2 = String             #14            // test
????#14 = Utf8              test
??????main?????????????У?0 ~ 2?ж?????? String test = "test"; ????????????ldc #2 ?? astore_1??
????// main????????????
????public static void main(java.lang.String[]);
????Code:
????0: ldc           #2                  // String test
????2: astore_1
????3: return
????1??Test??????????????”test”???????Constant pool????÷???????symbol??????????? ldc #2 ?????????Constant pool?????? #2 ??symbol??δ???????????C++???? StringTable::intern ????????char???飬?????????????StringTable????????У????′ε??? ldc #2 ???????????Constant pool???????? #2??? “test” ??????????????????ε?StringTable?в????
????2??astore_1???”test”?????????????????????????С?
?????????????????? ?? JDK6??7??8???в????????
????1??JDK6?????汾?У??????????????PermGen???з????????????????PermGen????С???????
????2??JDK7?У?????????????Java??????з?????ζ??????????????С?????????
????3??JDK8?У???????????????PermGen??
??????????????
?????????????????????????г?????????泣????String????
???????泣??
????public class StringTest {
????public static void main(String[] args) {
????String a = "java";
????String b = "java";
????String c = "ja" + "va";
????}
????}
??????? “javap -c” ?????????????????

????????ldc???int??float??String????????????????????????????????a??b??????????”java”???????????????????????????a??b??c?????????? “java” ??????????? “ja” + “va” ?????????????”java”???????c??
????String????
????public class StringTest {
????public static void main(String[] args) {
????String a = "java";
????String c = new String("java");
????}
????}
????????????£?a == c ??????????????????£?

????????3 ~ 9??????????? String c = new String("java"); ????
????1????3??new?????Java?????String??????????棻
????2????7??ldc??????????????л??”java”?????????????????в????????????????????”java”??????????????
????3????9??invokespecial??????ù????????????String????
????????String?????????char????洢???????????a????????”java”???????????c???Java???String???????????char????????????”java”??????????????? a != c????????????

??????? “?????? + String????” ???и??????????
????public class StringTest {
????public static void main(String[] args) {
????String a = "hello ";
????String b = "world";
????String c = a + b;
????String d = "hello world";
????}
????}
????????????£?c == d??????????????????£?

????????6 ~ 21??????????? String c = a + b; ????
????1????6??new?????Java?????StringBuilder??????????棻
????2????10??invokespecial??????ù????????????StringBuilder????
????3????14??18??invokespecial???????append?????????a??b???????
????4????21??invokespecial???????toString??????????String????
??????????????????????????????????????????????λ??????StringBuilder??append??????????c?????Java???????String????????d????????”hello world”??????????? c != d??
???????????????????????final???ε?????????????????????????????????????????????????????????
????public class StringTest {
????public static void main(String[] args) {
????final String a = "hello ";
????final String b = "world";
????String c = a + b;
????String d = "hello world";
????}
????}
?????????????£?

????END??