????String.intern()???
????String.intern()?????Native????????????C++?? StringTable::intern ??????????????????? intern ????????????????????????????????????е??????????????????????????????У?????????????????á?
????package com.ctrip.ttd.whywhy;
????class Test {
????public static void main(String args[]) {
????String s1 = new StringBuilder().append("String").append("Test").toString();
????System.out.println(s1.intern() == s1);
????String s2 = new StringBuilder().append("ja").append("va").toString();
????System.out.println(s2.intern() == s2);
????}
????}
?????? JDK6 ?? JDK7 ?н?????????
????1??JDK6????н????false false
??????????????????????JDK6?У????????????????棬????Java????????????????????intern????????????????????????????????????????????и????????????????????????????????????intern??????????????????????????????????????????????PermGen????????

????2??JDK7????н????true false
???????????????е????????JDK7?У????????????Java?????????棬???intern??????????????????????????????????????????????????????????????????????????????в????????????JDK7?У???????????????intern??????????String??????????????

???????????s1????????????? “StringTest” ???????s1.intern() ?? s1???????Java???????String????
???????????s2????????????????????? “java” ??????????? s2.intern() ??????????? “java” ??????????á?
????String.intern()????
???????????????StringTable???????????????????????HashMap????????????????hashcode??λ??????????飬??????????????????????????????????????Ч???
??????JDK6?У????????????PermGen?У????????С????????????????÷?????
??????JDK7??8?У????????-XX:StringTableSize????StringTable??С?????????????????????????intern???????????
????public class StringTest {
????public static void main(String[] args) {
????System.out.println(cost(1000000));
????}
????public static long cost(int num) {
????long start = System.currentTimeMillis();
????for (int i = 0; i < num; i++) {
????String.valueOf(i).intern();
????}
????return System.currentTimeMillis() - start;
????}
????}
?????????????intern()?????????StringTableSize??????????£?
????1??-XX:StringTableSize=1009?? ??????23000ms??
????2??-XX:StringTableSize=10009?? ??????2200ms??
????3??-XX:StringTableSize=100009?? ??????200ms??
????4?????????£???????400ms??
?????????StringTableSize?£???в????intern()??????????????£?
????1?????Σ???????5ms??
????2?????Σ???????25ms??
????3???????Σ???????130ms??
????4???????Σ???????400ms??
????5???????Σ???????5000ms??
????6??????Σ???????15000ms??
????????Щ??????????????????????Java 7?????intern()??????μ????????????????????????????????????intern(????????????????????????????????????????????????????????????????????????intern()???????????н???
????END??