习题一(JDK1.8)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public class TestStringTable {
public static void main(String[] args) { String s1 = "a"; String s2 = "b"; String s3 = "a" + "b"; String s4 = s1 + s2; String s5 = "ab"; String s6 = s4.intern(); System.out.println(s3 == s4); System.out.println(s3 == s5); System.out.println(s3 == s6);
String x2 = new String("c") + new String("d"); String x1 = "cd"; x2.intern(); System.out.println(x1 == x2);
String y2 = new String("e") + new String("f"); y2.intern(); String y1 = "ef"; System.out.println(y1 == y2); }
}
|
输出答案
展开查看
false
true
true
false
true
解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| public class TestStringTable {
public static void main(String[] args) { String s1 = "a"; String s2 = "b"; String s3 = "a" + "b"; String s4 = s1 + s2; String s5 = "ab"; String s6 = s4.intern(); System.out.println(s3 == s4); System.out.println(s3 == s5); System.out.println(s3 == s6);
String x2 = new String("c") + new String("d"); String x1 = "cd"; x2.intern(); System.out.println(x1 == x2);
String y2 = new String("e") + new String("f"); y2.intern(); String y1 = "ef"; System.out.println(y1 == y2); }
}
|
习题二(JDK1.6)
思考在JDK1.6环境下执行习题一代码
输出答案
展开查看
false
true
true
false
false
解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| public class TestStringTable {
public static void main(String[] args) { String s1 = "a"; String s2 = "b"; String s3 = "a" + "b"; String s4 = s1 + s2; String s5 = "ab"; String s6 = s4.intern(); System.out.println(s3 == s4); System.out.println(s3 == s5); System.out.println(s3 == s6);
String x2 = new String("c") + new String("d"); String x1 = "cd"; x2.intern(); System.out.println(x1 == x2);
String y2 = new String("e") + new String("f"); y2.intern(); String y1 = "ef"; System.out.println(y1 == y2); }
}
|
总结
1、理解串池的概念和变量存放位置
2、在JDK6中data.intern()方法是复制一份data出来执行加入串池的操作,加入成功或失败都返回串池中的数据
3、在JDK8中data.intern()方法是直接data执行加入串池的操作,加入成功data指向串池中数据的地址,失败则对象不变,加入成功或失败都返回串池中的数据
4、JDK6串池用的永久代,JDK8串池用的堆空间
5、-XX:StringTableSize=1009 可以设置StringTable的桶个数,最小是1009
