intern()方法可以把堆中的字符串对象放入串中,参考以下代码。

public class Demo1_23 {

    // String table["ab", "a", "b"]
    public static void main(String[] args) {

        String x = "ab"; 
        String s = new String("a") + new String("b");     // 堆  new String("a")   new String("b") new String("ab")
        String s2 = s.intern();//将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池,会把串池中的对象返回
        System.out.println( s2 == x);  //true,s2与x都是串池中的对象
        System.out.println( s == x ); //true,s是堆中的对象,与串池中的对象是不同的对象
    }

}

不过jdk1.6中调用intern()方***将字符串尝试放入串池,如果有则不会放入,如果没有则会复制一份放入串池,因此,串池中的对象与堆中的对象并不是同一个对象。上面同样的代码再jdk1.6中s == x返回false。

串池的特点总结如下。

图片说明