public class StringInternTest { public static void main(String[] args) { // 使用char 数组来初始化a,避免在a 被创建之前字符串池中已经存在了值
为"abcd"的对象 String a = new String(new char[] { 'a', 'b', 'c', 'd' }); String b = a.intern(); if (b == a) { System.out.println("b 被加入了字符串池中,没有新建对象"); } else { System.out.println("b 没被加入字符串池中,新建了对象"); } } } 运行结果是b 没被加入字符串池中,新建了对象
求分析过程。
谢谢
为"abcd"的对象 String a = new String(new char[] { 'a', 'b', 'c', 'd' }); String b = a.intern(); if (b == a) { System.out.println("b 被加入了字符串池中,没有新建对象"); } else { System.out.println("b 没被加入字符串池中,新建了对象"); } } } 运行结果是b 没被加入字符串池中,新建了对象
求分析过程。
谢谢
Java运行环境有一个字符串池,由String类维护。
1、执行语句String str="abc"时,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给str,如果不存在则先在字符串池中新建一个字符串"abc",然后再将其赋给str。
2、执行语句String str=new String("abc")时,不管字符串池中是否存在字符串"abc",直接新建一个字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后将其付给str。
3、当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
String a = new String(new char[] { 'a', 'b', 'c', 'd' }); 这个就是第二种情况了,此时字符串a不在字符串池中,String b = a.intern(); 因为a不在字符串池中,所以在执行a.intern()时,会把a添加在池中,然后返回a的引用,所以b的值就是a的引用,所以a不等于b。如果不用new关键字,把String a = new String(new char[] { 'a', 'b', 'c', 'd' });变成:String a = "aaaa" ; 结果就是a==b了
public static void main(String[] args) {
String a = "aaaa";
String b = a.intern();
if (b == a) {
System.out.println("b 被加入了字符串池中,没有新建对象");
} else {
System.out.println("b 没被加入字符串池中,新建了对象");
}
}b 被加入了字符串池中,没有新建对象 <--这是结果
我要鄙视楼上
String a = new String(new char[] { 'a', 'b', 'c', 'd' });
System.out.println(a=="abcd");
看错了楼上,对不起呀可以证明通过String a=new String(bytes[] b)来产生String对象时,只有a是指向它的引用其余不是String a = new String(new char[] { 'a', 'b', 'c', 'd' });
String b = a.intern();
System.out.println(b=="abcd");证明字符串常量池里已经b和"abcd"是指向的同一对象,即字符串常量池的"abcd";
b==a就相当于 a="abcd" 这不可能相同呀
都会执行第一个打印语句