String intern()

189 阅读1分钟
String s3 = new String("1") + new String("1");
String intern = s3.intern();
System.out.println(s3==intern);

先来看看字符串的+

The Java language provides special support for the string
concatenation operator ( + ), and for conversion of other objects
to strings. String concatenation is implemented through the
StringBuilder(or StringBuffer) class and its append method. String
conversions are implemented through the method toString, defined by
Object and inherited by all classes in Java. For additional
information on string concatenation and conversion, see Gosling,
Joy, and Steele, The Java Language Specification.

可以看出,实际上是StringBufferappend(String x)操作。StringBufferString需要使用toString()。来看看他的源码

// toStringCache 是一个 char[]
@Override
public synchronized String toString() {
    if (toStringCache == null) {
        toStringCache = Arrays.copyOfRange(value, 0, count);
    }
    return new String(toStringCache, true);
}

调用了String(char[] s)的这个构。

这个构造方法创建出来的字符串并没有在常量池中产生对象,这是重点。

jdk 1.7之后intern() 这个方法如果在常量池中没有发现对象的话,会在常量池中放一个指向堆的引用。

谜题解开。