这是 1.8
的用法,1.8
之前是不一样的。
在看这个之前请仔细研读
- intern
- 讲这个字符串对象尝试放进串池,如果有则并不会放入,如果没有则会放入,并把串池中的对象返回
1 | package com.redisc; |
输出
1 | true |
这个要一步步解析才能知道
String s = new String("a") + new String("b");
- 这句话其实创建了
5
个对象 - 使用
"a"
,"b"
,在串池中生成["a","b"]
new String("a") , new String("b")
相当于在堆中创建了2
个对象new String("a") + new String("b") = new String("ab")
new String("ab")
是动态拼接产生的结果,所以,只会在堆中,并不会在串池中,此时串池为["a","b"]
- 这句话其实创建了
String s2 = s.intern();
- 由于串池中没有
"ab"
,所以,将其放入串池中,此时,串池为["a","b","ab"]
- 并且
s2
也是串池的"ab"
- 另外,
s.intern()
还会把s
的引用也放到了串池中- 这句话,我没理解,但是
s == "ab"
确实是true
- 这句话,我没理解,但是
- 由于串池中没有
System.out.println(s2 == "ab");
true
System.out.println(s == "ab");
true
,这个的逻辑没理解
再来一个代码
1 | package com.redisc; |
输出
1 | true |
String x = "ab";
- 这一句执行的时候,已经把
"ab"
放到了串池中
- 这一句执行的时候,已经把
String s2 = s.intern();
- 由于串池中有了
"ab"
,所以,这句话执行失败
- 由于串池中有了