请问各位大侠们:
在下有这么一个低极的问题请教:
String s1=new String("xyz");
String s2=new String("xyz");
共创建了几个对象??
为什么?他在内存中的状态是怎么回事?
谢谢!!

解决方案 »

  1.   

    问的很好,这个关系到数据结构的方面.涉及到的方面很广,我就讲讲有关你的问题.记住每new一次,就会出现一个对象,那么你上面就有两个对象,不必问为什么,new的作用就是生成对象.那么在内存中的状态呢又是怎么样呢.因为是字符串,其实两个对象中都装了xyz的地址,而且这个地址是相同的,在内存中有这么一块内存,叫字符串池,专门用来放字符串的.很多会理解在两个不同的对象里应该放两个xyz呀,本来应该这样,但是,字符串应用的很多,在程序中基本上都是用字符串来描述的,所以如果很多对象放同样的字符串,那么内存中就要开很多的内存空间来存放相同的字符串.因此,在JAVA中,将字符串中放到规定的内存中(字符串池),如果发现一个对象中的数据有字符串的,就首先到字符串池中找有没有相同的,如果有,就把这个字符串池中的字符串地址给这个对象.这样就可以减少内存空间的重复开辟.
      

  2.   

    用new 就是2个对象,我也只知道这么多
      

  3.   

    是3个
    一个"xyz"
    第二个 s1
    第三个 s2
      

  4.   

    To:aelang0725
    对你的说法存在怀疑,
    做了个测试.public class StringTest
    {
      public static void main(String[] args)
      {
        String s1=new String("xyz");
        String s2=new String("xyz");
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));
      }
    }结果是:false true
    ==是用来测试二个字符串是不是放在同一个位置上,而结果是false,所以你的说法不对.
      

  5.   

    楼上正确.
    To:aelang0725
    String s1="xyz";
    String s2="xyz";
    System.out.println(s1==s2);
    System.out.println(s1.equals(s2));
    这样才是你说的那种情况
      

  6.   

    在JAVA这个不存在指针和地址的环境中,讨论这个有意义吗?就算你知道这个对象没用了,可以释放空间了,你能把它释放吗?
    JVM能听你的吗?要我说,知道如何写clone()方法,就足够了!深COPY,浅COPY,
    都是写书的人来忽悠人的!
      

  7.   

    /*对象的地址都是不同的,除非他们引用的是同一个对象,这里是同一个对象而不是具有相同"值"的对象,所以上面的代码是2个对象他们的值相同,但是他们的地址并不相同。字符串在Java里面是引用数据类型,int,float,char等等是原始数据类型。实际上"=="比较原始数据是比较原始数据的值,而用来比较引用数据的时候只有一种情况才返回true,就是来比较的2个引用都指向同一个对象。
    TO: sanpi828()
    aelang0725()说得有一定道理,关键是你用了new所以你的s1==s2是false,如果你不用new呢?
    拷贝下面的代码运行一下看看!
    那么下面的代码创建了几个对象呢?
    我认为只创建了1个对象就是"xyz",但是创建了2个引用s1,s2都指向对象"xyz"。*/
    //StringTest.java
    public class StringTest
    {
      public static void main(String[] args)
      {
        String s1="xyz";
        String s2="xyz";
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));
      }
    }
      

  8.   

    呵呵,各位,我上面说的地址是一样没错的(那么什么什么的权威人士也是这么说的哟,呵呵),关于各位用"=="是不能用来比较的,首先对象中封装了基本变量的内容(我说过里面的地址相同),还有就是对象中有堆的引用,也就是到S1和S2的引用.虽然说不存在C语言中的地址,但是我们想想,数据中的地址都被封装了.搞成什么的所谓引用. 
    sg552(:)) ( ) 信誉:100    Blog  2006-12-11 22:16:54  得分: 0  
     
     
       在JAVA这个不存在指针和地址的环境中,讨论这个有意义吗?就算你知道这个对象没用了,可以释放空间了,你能把它释放吗?
    JVM能听你的吗?要我说,知道如何写clone()方法,就足够了!深COPY,浅COPY,
    都是写书的人来忽悠人的!
      
     
    这位仁兄说话够简洁明了,很多东西主要在学习起初时因为不明白所以我们必须要懂的它在内存中的分布,能够使我们更好的理解东西.为什么我们中国人都在使用外国老的东西开发,一想到国所谓的很多牛人,真的牛吗?
      

  9.   

    如果答案是两个,那Java也太简单了,呵呵呵
      

  10.   

    好象是这样的,
     String x1 = "xyz";
     String x2 = "xyz"; 
    其中"xyz"只在内存中存了一次吗?
    两个都只是引用而以,像C中的指针吗