运行时常量池是方法区的一部分,Class文件中除了类的版本、字段、方法、接口,还有一项就是常量池,他在运行期被JVM装载,并且可以扩充。String的intern()就是扩充常量的一个方法。
当一个String的实例string调用intern()方法时,java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其引用,没有则在常量池中增加一个Unicode等于string的字符串并返回他的引用,同时string变量仍然存在。
例子:
String s0= “kill”;
String s1=new String(”kill”);
String s2=new String(“kill”);
System.out.println( s0==s1 );
System.out.println( “**********” );
s1.intern();
s2=s2.intern(); //把常量池中“kill”的引用赋给s2
System.out.println( s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );
结果为:
false
**********
false //虽然执行了s1.intern(),但它的返回值没有赋给s1
true //说明s1.intern()返回的是常量池中”kvill”的引用
true