日期:2014-05-20  浏览次数:20710 次

老问题回顾,到底创建了几个string对象
String   a   =   "abc ";
    String   b=new   String( "abc ");

    毫无疑问创建了2个对象。

      a   !=   b

      那么:
    String   b=new   String( "abc ");
    String   a   =   "abc ";
   
      a是否等于b呢?
      这个问题我一直很困惑。
     
        按照我的理解,首先内存分配一块地址用来存放“abc”,b指向“abc”。
        然后在创建一个引用变量a,然后再在内存中寻找“abc”,结果他发现内存中有“abc”了,所以将指针指向了“abc”,
        这样一来,不是创建了一个对象么?

        可是答案。。。。。。

------解决方案--------------------
String a = "abc ";
此句不会在堆内存中搜索相应数据吧
应该是在栈中。
我是猜测,有点印象。
------解决方案--------------------
後面建立String對象的時候,用到的 "abc "分配到堆裏面了麼?我認為是先生成一個常量,然後像頭一部分一樣,根據這個常量生成一個對象,所以也是兩個。
------解决方案--------------------
我觉得是编译器的优化问题.对于象String这样的Immutable对象,在上述的两种情况下,优化为一个对象分配都是没有问题的,但逻辑上都是两个不同的对象.我个人意见是程序设计不能于编译器的实现.
------解决方案--------------------
同意luyang1016
变量储存的地方都不同,
一个存在栈中,
一个是存在堆中的
------解决方案--------------------
不是创建一个对象,而是创建了一个对象的引用 ...
------解决方案--------------------
mark。回去在讨论这个问题。。
------解决方案--------------------

由于字符串对象的大量使用(它是一个对象,一般而言对象总是在heap分配内存),Java中为了节省内存空间和运行时间
(如比较字符串时,==比equals()快),在编译阶段就把所有的字符串文字放到一个文字池(pool of literal strings0中,
而运行时文字池成为常量池的一部分。文字池的好处,就是该池中所有相同的字符串常量被合并,只占用一个空间。
我们知道,对两个引用变量,使用==判断它们的值(引用)是否相等,即指向同一个对象:

String s1 = "abc " ;
String s2 = "abc " ;
if( s1 == s2 ) System.out.println( "s1,s2 refer to the same object ");
else System.out.println( "trouble ");


这里的输出显示,两个字符串文字保存为一个对象。就是说,上面的代码只在pool中创建了一个String对象。

String a = "abc ";
上面的代码只在pool中创建了一个String对象。
String b=new String( "abc ");
这里 "abc "本身就是pool中的一个对象,而在运行时执行new String()时,将pool中的对象复制一份放到heap中,并且把heap中的这个对象的引用交给b持有
所以创建了2个String对象. a指向pool中的对象,b指向heap中的对象;

反过来
String b=new String( "abc ");
String a = "abc ";
第一条语句已经生成了2个对象,pool和heap中各1个,所以执行String a = "abc "时,pool中已经存在 "abc ",所以a和b都指向pool中的对象.



------解决方案--------------------
恩,楼上的楼上最后说错了.a和b确实指向不同的对象.a指的是pool中的对象,b应该指的是heap中的对象
------解决方案--------------------
a=b 比较的对象的引用 在堆中查找, a.equals(b) 则比较得是对象指定的实际的字符串值 从栈中查找 如同 cycher() 所说的 java在栈中将相同的字符串共用同一个空间 但是 String b=new String( "abc ") 与String a= "abc " 确实在堆中创建了两个对象的引用 所以a=b false 而a.equals(b) 返回true
------解决方案--------------------
luyang1016(闭月羞花猫)
大师说过: 一切都是对象
----------------------
我心里也一直牢记“一切都是对象”

String a = "abc ";
这句话创建的是一个String对象abc,a为引用变量。
不管string 是基本数据类型,还是string或其他类型为常用类型,为了节省内存而如何,
我总在想:a是不是对象??如果不是对象,那a是什么??
--------
难道真的“没有绝对”,“一切都是对象”也有例外??