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 没被加入字符串池中,新建了对象 
求分析过程。 
谢谢

解决方案 »

  1.   

    new String首先在字符串池中创建对象,然后在堆中创建对象,返回堆中的给引用
      

  2.   

    字符串池和String类的基本关系:
       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了
      

  3.   


    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 被加入了字符串池中,没有新建对象 <--这是结果
    我要鄙视楼上
      

  4.   


    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" 这不可能相同呀
      

  5.   

    a = a.itern();
    都会执行第一个打印语句