首页 > 技术文章 > String和intern()浅析

douyamv 2017-03-10 09:37 原文

String a = new String("aa"),代表在堆内存中,创建了一个字符串对象,变量a指向该对象,而该对象又指向在常量池中的字符串常量。
而String a = "aa"代表直接由变量a指向常量池中的字符串,省去了中间的堆内存中的对象,因为new对象时,都会在堆中创建对象。
这就像如果有:
String s1 = "hello"; 
String s2 = "hello";
那么
System.out.println(s1==s2);
结果为true,因为他们的地址值是一致的,都指向常量池中的字符串常量。

String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1==s2);
结果则是false,因为他们都在堆中建立了对象,而对象之间的地址值不同

 

 

intern 这个方法返回的是 返回字符串对象的规范化表示形式,当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。

 

 

public class test{

public static void main(String[] args) throws Exception {

String s1 = new String( "ab123" ) ;
String s2 = new String( "ab123" ) ;
System.out.println( s1 == s2 ); //false

String s3 = "ab123";
String s4 = "ab123";
System.out.println( s3 == s4 ); //true
System.out.println( s3 == s2 ); //false

String s5 = s1.intern() ;
String s6 = s3.intern() ;
System.out.println( s5 == s1 ) ; //false
System.out.println( s5 == s3 ) ; //true

System.out.println( s6 == s5 ) ; //true

}
}

推荐阅读