String str1=new String("abc");
String str2="abc";
些两句有创建了多少个对象。正确的答案是创建了两个对象。问题:
我对这两句的理解:
String str1=new String("abc"); 创建了两个对象,new一个对象和创建了一个字符为abc的值的对象,并把abc放在堆中。
String str2="abc"; 创建一个新的对象,并把abc放在栈中。
所以我不知道为什么只有两个对象。除非第一句中,堆也是可以共享数据的。所以String str2="abc";中的abc才在堆中找到了abc,然后str直接指向abc。各位能不能给我解释下

解决方案 »

  1.   

    http://topic.csdn.net/u/20120607/07/9d3a5948-ca38-4eb9-a4f8-63400b34e13a.html
      

  2.   

    关于string池的讲解,网上文章也是相当多的。楼主不妨搜索看一看。String str1=new String("abc");
    这句之后,创建了两个对象,一个是new 出来的string对象。
    另一个是在string池中的“abc”。
    而执行String str2="abc";之后, 并没有创建新的对象,str2指向了第一行代码创建的那个在string池中的abc而已。
      

  3.   

    String str1=new String("abc");
    这句之后,创建了两个对象,一个是new 出来的string对象 ,堆中
    另一个是在string池中的“abc”。
      

  4.   

    csdn这个老出问题的网站有什么不可能呢?!
      

  5.   

    过来打个酱油,String对象太多了,经常不知道有多少
      

  6.   


    (楼上说的对,如果这里"abc"原来没有,才创建新的)
      

  7.   

    String str1=new String("abc");//创建两个对象,一个在string池中,一个在堆中,而str1的引用是指向堆中的
    String str2="abc";//不会创建新的对象,此语句执行时会在string池中查找是否存存值为abc的string对象,找到后直接将string池中的引用返回,即str2的引用是指向string池中的.
      

  8.   

    觉得12楼的说的在理。
    如果换成这样:
    String str1="abc"; //创建了一个对象,放在String池中,内容为abc,str1指向string池.
    String str2=new String("abc"); //也创建一个对象,new一个对象,对象的内容放在堆中。
    这两个语句创建了两个对象。是不是也是这样理解的(PS:String str1="abc";在网上说的是abc是放在栈中,String池也是属于栈吗??)
      

  9.   

    为什么不信这个帖子呢?
    http://www.iteye.com/topic/774673写jvm的人写的帖子,此人现在在oracle,还有比他更懂的吗
      

  10.   

    原因可能是:
    1.大家期待的是到底是1还是2这样的答案,而不是“It depends”。
    2.太复杂,可能看不懂,或者读起来不容易接受。
    而且只要写的通俗易懂,哪怕知识是错的也不重要,看一下这种帖子http://sd.csdn.net/a/20120629/2806999.html都能广为流传就知道了。
      

  11.   


    流传多年,影响了大批人。
    你看13楼回帖的ps部分“PS:String str1="abc";在网上说的是abc是放在栈中,String池也是属于栈吗??”,这里的“网上说”基本都是那个帖子或者其变种。
      

  12.   


    1.直接赋纯字符串值时,会首先检查pool池中,若有则返回pool的引用,若无则在pool池中创建后返回引用;
    2.通过new赋值,会首先检查pool澉中,若有则复制一份到heap上,并返回heap上的引用;若无,则在pool中创建后再复制一份到heap上并返回heap上的引用;
    3.对包含了new方式创建对象的"+"连接表达式所产生的对象未放入pool中;对于类似str=1+"AAA"+2+3这种强制类型转化形成的String对象也不会放到pool中的;
      

  13.   

    字符串创建对象时,首先要看String pool里面有没有这个对象,如果没有,现在String pool里面先创建一个对象,然后要在堆里面创建一个对象,赋给引用变量。
    String str1=new String("abc");说明String pool里面没有“abc”这个对象,先在String pool中创建了一个“abc”对象,然后再在堆里面创建一个“abc”的对象,并把“abc”的地址赋给str1;
    String str2="abc";这时String pool里面已经有了“abc”的对象,因此,直接在堆里面创建一个“abc”的对象
    并把地址赋给str2,导致str2指向了堆中创建的这个“abc”字符串对象。
    因此在堆里面创建了两个对象。