a "对应一个字符串对象,
String   a   =   "a ";
只是让变量a引用到这个对象。而
String   a   =   new   String( "a ");
以这个已有的对象 "a "为样本,构造出一个内容完全相同的另一个对象,然后让变量a引用到它。
但是字符串的驻留优化机制是这样实现的:
当我们创建一个string对象的时候,JIT编译器会将该字符串的值写进一张哈希表里面,如果再有新的字符串对象被创建,就会与哈希表里面的值进行对比,如果你所创建的对象已经存在与哈希表内,就把该指针指向表里面的那个对象,不会再新建对象,这样就实现了共享。
到底该怎么说String a="a";和String a=new String("a");的区别是什么.
求解释。

解决方案 »

  1.   

    http://wenku.baidu.com/view/ad5ce37f5acfa1c7aa00cc16.html  有你要的
      

  2.   

    String a = new String( "a ");
    这句能编译过么?
      

  3.   

    String a = new String( "a ");
    这个是Java才有的写法再来说说这段话内容的含义。  当我们创建一个string对象的时候,JIT编译器会将该字符串的值写进一张哈希表里面,如果再有新的字符串对象被创建,就会与哈希表里面的值进行对比,如果你所创建的对象已经存在与哈希表内,就把该指针指向表里面的那个对象,不会再新建对象,这样就实现了共享。实际上 当你声明出一个 "a" 对象的时候,它在内存当中会占用一个位置存放它自己 我们假设内存是一个九宫格,他能存9个对象,坐标分别为[align=center][1,1] [1,2] [1,3]
    [2,1] [2,2] [2,3]
    [3,1] [3,2] [3,3][/align]
    这样的一个盒子String str1 = "a";
    假设str1的坐标为[1,1]
    这个时候你声明一个str2 而str2的值还是"a"
    String str2 = "a";
    那么计算机就认为"a"已经存在 str2的坐标也应该是[1,1]注意:在.net中"=="已经被重载为比较对象了,如果你要比较引用的话必须用Object.ReferenceEquals(obj1,obj2)这个方法。
    用上述方法可以得到str1和str2的引用是一样的 结果是true这时你也许会产生一个疑问,当改变str2的值的时候str1岂不是也变了。
    str2 = "b";
    执行这句话的时候,和上面是等效的。计算机会在这个九宫格里面找"b"没有发现的话,就会在其他的格子里面放进去一个"b" 假设这个对象存在[1,2]格子里面。那么此时str2指向的就是[1,2]了,和str1一点关系都没有。String strA=new String('a',1);
    String strB=new String('a',1);
    A和B的引用是两个,说明new String是直接开辟一个新内存具体可以自己尝试一下,记得比较引用用Object.ReferenceEquals(obj1,obj2)这个方法,不要用“==”
      

  4.   

    String字符串很特殊,经过了特别处理,还有一个常量池东西