class StringTest
{
public static void main( String[] args )
{
String a = "Hello World";
String b = "Hello World";
String c = a;
System.out.println("a=b?"+( a==b ));
System.out.println("c=a?"+( c==a ));
System.out.println("c=b?"+( c==b ));
}
}结果为
a=b?true
c=a?true
c=b?true但是如果改为
String a = new String( "Hello World" );
String b = new String( "Hello World" );
String c = a;结果就变成了
a=b?false
c=a?true
c=b?false请问为什么会这样子?在定义时是用new好还是不用比较好??

解决方案 »

  1.   

    String 被设计不变模式的;有一个String池来处理,当你用直接赋值的方法定义String 时
    会现在池里面查找,看是不是已经存在,没有的话才生成String s = new String("ddd");就直接在heap里面生成对象了,不查找String池
      

  2.   

    String a = "Hello World";
    String b = "Hello World";
    String c = a;
    ==============================
    在内存堆中生成一个String对象,内容是“Hello World”,变量a引用这个对象;变量b也已用这个对象;c=a对象是赋址的,即引用的地址,所以c也引用这个对象;
    在java中==是内存对象的比较,即变量是否指向同一个地址
      

  3.   

    String a = new String( "Hello World" );
    String b = new String( "Hello World" );
    String c = a;
    ==========================
    产生一个"Hello World"对象,并赋给a;new就是产生,new同一个非单例的类得到的实例对象是String$..(这里是数字或者字母或者其组合);
      

  4.   

    new String("") 这种用法很别扭的,实际上不应该这么用,没什么必要。