0%

java | StringTable intern 1.8

这是 1.8 的用法,1.8 之前是不一样的。

在看这个之前请仔细研读

  • intern
    • 讲这个字符串对象尝试放进串池,如果有则并不会放入,如果没有则会放入,并把串池中的对象返回
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.redisc;

import lombok.extern.slf4j.Slf4j;

@Slf4j(topic = "c.Run")
public class Run {

public static void main(String[] args) {
String s = new String("a") + new String("b");

String s2 = s.intern();

System.out.println(s2 == "ab");
System.out.println(s == "ab");
}

}

输出

1
2
true
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.redisc;

import lombok.extern.slf4j.Slf4j;

@Slf4j(topic = "c.Run")
public class Run {

public static void main(String[] args) {
String x = "ab";
String s = new String("a") + new String("b");

String s2 = s.intern();

System.out.println(s2 == x);
System.out.println(s == x);
}

}

输出

1
2
true
false
  • String x = "ab";
    • 这一句执行的时候,已经把 "ab" 放到了串池中
  • String s2 = s.intern();
    • 由于串池中有了 "ab",所以,这句话执行失败
请我喝杯咖啡吧~