String创建对象时系统会自动创建一个字符串缓冲池,在你进行如String str = "a";
之类的操作时,系统会先在缓冲池中寻找有没有,如果没有就会创建一个。
String s1 = "abc";
String s2 = "abc";
创建了一个对象
由于s1创建时”abc”字符串已经被放入缓冲池,所以当s2创建的时候是不会产生一个新的对象,他们的引用都会是同一个。
String s1 = "abc";
String s2 = new String( "abc" );
创建了两个对象
这里由于s2用的是new,所以系统会分配一个新的引用地址给s2不会使用s1的引用地址。
String s1 = "abc";
String s2 = new String( "abc" ).intern();
创建了一个对象
这里由于使用了intern()方法(调用该方法返回一个字符串,内容与调用该方法的字符串的内容相同,但保证来源于缓冲池中,如果池中没有于该字符串相同的字符串就将该String对象放入池中,并且返回该对象的引用)
String s1 = "ab"+"c";
创建了一个对象
赋值符号右边的”a”、”b”、”c”都是常量。对于常量,编译时就直接存储它们的字面值而不是它们的引用,在编译时就直接将它们连接的结果提取出来变成了”abc” ,该语句在class文件中就相当于String s = “abc”,然后当JVM执行到这一句的时候, 就在String pool(字符串缓冲池)里找,如果没有这个字符串,就会产生一个。