String[] s2 = { "Hi" , "Hi" };中实际过程是:
s1="Hi";
s2="Hi";
而s1="Hi"后,系统调用了String的intern()方法把"Hi"给拘留了。
再次用s2="Hi",不再为"Hi"创建对象了。当然就指向同一个了。不知道这个解释对不对,还请高手指点。

解决方案 »

  1.   

    写错了:)
    String[] s2 = { "Hi" , "Hi" };中实际过程是:
    s1="Hi";
    s2="Hi";应该是
    String[] s2 = { "Hi" , "Hi" };中实际过程是:
    s2[0]="Hi";
    s2[1]="Hi";
      

  2.   

    jeandy(辉辉) 
    你的解释很正确...
      yunfei0103 (云飞)   如果,你自己做个实验  String s="aaa" String t="aaa";
     那么 s.intern() == t.intern() 返回 true.. 
     
     其实,系统内部,,当 s.equals(t)的时候,就intern()就会被调用.这样不节省资源嘛?:) 
      

  3.   

    那要是再加一句
    String s3 = new String("Hi");
    s3和s2[0]就不相等了,为什么?
    照你这么说,s2[0],s2[1]都是指向同一个对象,那编程思想写错了?
      

  4.   

    yunfei0103(云飞)new String("Hi"),当然是一个新的对象了...当然不是了.
    String s3="Hi";就肯定对了..
    (可以参见 new String 与 String)的区别..
    还有,你不想浪费new String("Hi")也可以..只需要比较的时候..System.out.println("s1[0]==s3?"+(s1[0]==s3.intern()));
    就可以得到你想要的结果了....
      

  5.   

    这个有赖于Java Language Specification [JLS, 3.10.5]
    较新版本的JVM对相同的String对象会重用。"... the object will be reused by any other code running in the same virtual machine that happens to contain the same string literal."但是用String s = new String("...");这种形式的话就例外。
      

  6.   

    String s1 = "Hi";
    String s1 = new String("Hi");
    有什么区别?
      

  7.   

    String s1 = "Hi";
    如果同一个JVM里面已经有一个String是"Hi",那么这个s1会指向那个现成的对象。String s1 = new String("Hi");
    不管当前JVM有没有"Hi",都会创建一个新的对象。
      

  8.   

    我来说一句,编程思想不是字典,也可能会有错误,不过既然是第三版了,出错的可能性比较小啦:)
    书可能没写清楚
    String[] s1 = new String[5];
    所有s1的元素都指向同一个对象//没错亚,因为s1[0],s1[1]...都是null值亚
    Arrays.fill(s1,"Hi");之后,这个数组的每个元素都指向"hi"了
      

  9.   

    yunfei0103(云飞)String s;
    相当与创建了一个引用(你可以想象成是一个指针)
    String s="Hi";
    把指针志向 char[] xxxxx={'H','i'}数组 (xxx,假设系统中随便定的一个变量)String s3 = new String("Hi");
    clone "Hi"来生成新的String yyyyyyyy, 然后,把s3引用 yyyyyy;
    也就是说,s3= new String("Hi"),是创建了两个对象..
      

  10.   

    书上写的是对的,你可以这样试试!
    随便生成一个class,含有一个static变量用来计算产生的对象的个数,就能看他生成多少个了!
    //####################################
    import java.util.*;class Small{
    static int count; //用来计数的
    Small(){count++;}
    }

    public class Test{
    public static void main(String[] args){
    Small[] a=new Small[10];
    Arrays.fill(a,new Small());
    System.out.println(Small.count);
    }
    }
    //################################################
    运行后输出的是 1 ,所以说只产生一个对象!至于s2[0]==s2[1]?true
    我觉得比较应该是对象的内容,并不是对象的引用,所以结果是true
      

  11.   

    关于这个问题再举几个例子:
    String s3="a";
    //s3=s3.intern();
    String s4="a";
    System.out.println(s3==s4);
    输出:true;String s3=new String("a");
    //s3=s3.intern();
    String s4="a";
    System.out.println(s3==s4);
    输出:false;String s3=new String("a");
    s3=s3.intern();
    String s4="a";
    System.out.println(s3==s4);
    输出:true;
      

  12.   

    jeandy(辉辉)
    我看了一下String类intern()方法,它说的意思是有那么一个字符串池,如果池里面有了你要创建的内容,它就不再产生新的对象。是么?谢谢你,也谢谢回答问题的人!!!
      

  13.   

    "... the object will be reused by any other code running in the same virtual machine that happens to contain the same string literal."(String)对象将会被任何在同一个JVM里面碰巧包含了相同字符串的代码重用。(使用new关键字的例外)intern方法的调用更能说明编译器和JVM在处理以下两种表达式的时候的区别:
    String s = new String("Some String");
    String s = "Some String";在更多的时候我们应该倾向于后一种写法。
      

  14.   

    你s1[0]==s1[1]比较的是2个数组单元的内容是否相等,要比较2个对象是否相等要用equal()
    s1[0].equals(s1[1])才是对象之间的比较