各位大虾们:
    如上所述,String str=new String("abc");创建了两个String类的对象(1:new String()所创建,2:“abc”通过Class类中的newInstance所创建===》不知理解是否有错?)。
    问题如下:在堆和栈中不知道是如何对应的,str、new String 、"abc"如何对应,求解,有图为最好!
              另外插一句,变量str放在堆和栈里与是否是合局变量有关系?是全局的就是在栈里面,局部的就在堆里面?

解决方案 »

  1.   

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

  2.   

    http://www.ticmy.com/?p=151
      

  3.   

    产生一个或两个String对象,abc是一个对象放在字符串常量缓冲区,不管出现多少遍,缓冲区中就这一个,如果以前使用过abc对象,那么在创建str对象的时候就会直接从字符串缓冲区中取abc对象
      

  4.   

    确实是创建了两个对象我举个例子吧
    ①String str = "abc" 这个只会创建一个对象。其首先检查字符串池(String Pool)里有没有该字符串,如果没有就创建这样一个字符串常量,同时将指向该对象的引用赋给str。如果String Pool里已经有这个字符串常量了,则以后都会将String Pool里指向该常量的引用赋值给 变量名,比如 str。
    ②String str = new String("abc") 这个会创建两个对象。首先其也会去检查字符串池(String Pool)里有没有该字符串,如果没有就创建这样一个字符串常量,然后再去内存堆里面创建一个 "abc"的字符串对象,同时将内存堆里的这个对象的引用返回给变量名str。如果String Pool里已经有这个字符串常量了,则不会再在String Pool里创建一个这样的字符串,这时,仍然会去内存堆里创建一个"abc"的字符串对象,然后将指向该对象的引用返回给变量名str。
      

  5.   

    非常感谢你的回答,不过我还是有几个问题不太明白。
     1:是String Pool是存在哪个地方的,堆和栈?哪一个,还是其它的?
     2:对象的引用是和NEW 出来的一起放在堆里的吗?
     3:String str=new String("abc");第一次创建的是一个什么(new String()?还是“abc”),放在堆里面?那第一次创建的和第二次创建的对象是怎么联连起来的?  呵呵,对这些问题一直不太明白,希望各位大虾能耐心解答。小弟在此感谢了!