/**
* public String intern()
* 返回字符串对象的规范化表示形式。
* 一个初始为空的字符串池,它由类String私有地维护。
* 当调用intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(Object)方法确定),则返回池中的字符串。
* 否则,将此String对象添加到池中,并返回此String对象的引用。
* 它遵循以下规则:对于任意两个字符串s 和t,当且仅当s.equals(t)为true时,s.intern() == t.intern()才为true。
*/
public static void main(String[] args) {
String a = new String("abc");
String b = new String("abc");
String c = "abc";
System.out.println(a == c);//false
System.out.println(b == c);//false
a = a.intern();
b.intern();
System.out.println(a == c);//true
System.out.println(b == c);//false
}
Java运行环境有一个字符串池,由String类维护。执行语句String str="abc"时,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给str,如果不存在则先在字符串池中新建一个字符串"abc",然后再将其赋给str。
执行语句String str=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后将其付给str。前一语句的效率高,后一语句的效率低,因为新建字符串占用内存空间。
同时,String对象是不可变的。查看JDK文档你就会发现,String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。而最初的String对象则丝毫未动。