String str="abc"                   //这个是引用??
String str=new String("abc")     //这个是传值??

解决方案 »

  1.   

    好像是在内存中位置的区别,“abc” 在栈内存,new 的在堆内存中
      

  2.   

    我觉得应该是一样的!!怎么现在CSDN上都没有大侠了...
      

  3.   

    http://topic.csdn.net/u/20080905/13/d78eb28b-6a2e-4192-a6f5-07de0b7fabce.html
    看看这个会对你有帮助的
      

  4.   

    第一个abc是在 字符串池中创建的
    第二个abc是在 堆内存中创建的str 只是一个引用, 指向了这两个对象而已。 楼主问的好像有点问题~ 
      

  5.   

    他们所指向的内存地址是不一样的亚,但是值是一样的,如果:string str1=“abd” string str2=“abd”,他们所指向的内存地址是一样的,值也一样
      

  6.   

    不一样,还有stringbuffer的比较,java虚拟机会维护一个内部的滞留字符串对象的列表(唯一字符串的池)来避免在堆内存中产生重复的String对象。当JVM从class文件里加载字符串字面量并执行的时候,它会先检查一下当前的字符串是否已经存在于滞留字符串列表,如果已经存在,那就不会再创建一个新的String对象而是将引用指向已经存在的String对象,JVM会在内部为字符串字面量作这种检查,但并不会为通过new关键字创建的String对象作这种检查。当然你可以明确地使用String.intern()方法强制JVM为通过 new关键字创建的String对象作这样的检查。这样可以强制JVM检查内部列表而使用已有的String对象。  所以结论是,JVM会内在地为字符串字面量维护一些唯一的String对象,程序员不需要为字符串字面量而发愁,但是可能会被一些通过 new关键字创建的String对象而困扰,不过他们可以使用intern()方法来避免在堆内存上创建重复的String对象来改善Java的运行性能。http://linpyi.javaeye.com/blog/228324 可以看看这里
      

  7.   

    第一个abc是在 字符串池中创建的 
    第二个abc是在 堆内存中创建的 
      

  8.   

     简单的说,引用其实就像是一个对象的名字或者别名 (alias),一个对象在内存中会请求一块空间来保存数据,根据对象的大小,它可能需要占用的空间大小也不等。访问对象的时候,我们不会直接是访问对象在内存中的数据,而是通过引用去访问。引用也是一种数据类型,我们可以把它想象为类似 C 语言中指针的东西,它指示了对象在内存中的地址——只不过我们不能够观察到这个地址究竟是什么。
      如果我们定义了不止一个引用指向同一个对象,那么这些引用是不相同的,因为引用也是一种数据类型,需要一定的内存空间来保存。但是它们的值是相同的,都指示同一个对象在内存的中位置。比如
    String a = "Hello";
    String b = a;
      这里,a 和 b 是不同的两个引用,我们使用了两个定义语句来定义它们。但它们的值是一样的,都指向同一个对象 
      

  9.   

    老问题了!
    虽然两个语句都是返回一个String对象的引用,但是jvm对两者的处理方式是不一样的。对于第一种,jvm会马上在heap中创建一个String对象,然后将该对象的引用返回给用户。对于第二种,jvm首先会在内部维护的strings pool中通过String的 equels 方法查找是对象池中是否存放有该String对象,如果有,则返回已有的String对象给用户,而不会在heap中重新创建一个新的String对象;如果对象池中没有该String对象,jvm则在heap中创建新的String对象,将其引用返回给用户,同时将该引用添加至strings pool中。注意:使用第一种方法创建对象时,jvm是不会主动把该对象放到strings pool里面的,除非程序调用 String的intern方法。
    String str1 = new String("abc"); //jvm 在堆上创建一个String对象    
       
     //jvm 在strings pool中找不到值为“abc”的字符串,因此    
     //在堆上创建一个String对象,并将该对象的引用加入至strings pool中    
     //此时堆上有两个String对象 
      

  10.   

    发错了 第一种是:String s = new String("abc");
    第二种是:String s = "abc";
      

  11.   

    怎么又在问这个问题,CSDN上已经很多这个帖子了,自己花个时间好好分析下堆栈
      

  12.   

    abc的值在pool中只有一个,只不过new需要在栈中创建
      

  13.   

    第一个是在栈
    中建立一个STR引用指向在栈中建立的一个对象具有共享性
    第二个是实实在在的在堆中一个对象
      

  14.   

    11楼的错了(String a = "Hello"; String b = a; 这里,a 和 b 是不同的两个引用),使用以下语句说明a,b引用和值都是一样的! String str1="abc";
    String str2=str1;
    String str3=new String("abc");
    System.out.println("str1="+str1+" str2="+str2+" str3="+str3);
    if(str1==str2){
    System.out.println("str1和str2引用一样,值一样!");
    }
    if(str1!=str3){
    System.out.println("str1和str3引用不一样,值一样!");
    }
    结果:str1=abc str2=abc str3=abc
    str1和str2引用一样,值一样!
    str1和str3引用不一样,值一样!