这是 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",所以,这句话执行失败
- 由于串池中有了