string str="abc"
在java中,单独这句最多创建一个对象,那么这个对象到底存在在内存的什么地方呢,是存在椎中还是栈中呢?
有一种比较多的说法是"abc"对象创建在string池中,那么请问一下这个String池是存储在椎中还是栈中呢?还有,string str2 = new String("abc")一般创建两个对象,那这两个对象又存储在内存的什么对方?

解决方案 »

  1.   

    讨论过很多次了  首先在字符串常量池中创建abc  然后再在堆new String("abc") 
    字符串常量池即不在栈也不在椎
      

  2.   

    这个帖子也讨论了这样的问题,可惜各有不同的观点,也不知哪个对的。
    http://topic.csdn.net/u/20080509/09/909142fc-6eb0-4886-94e5-0d6448c1a1c5.html?437417952
      

  3.   

    在java中数据存储分为堆和栈,应该不在堆中就在栈中吧
      

  4.   

    Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。http://blog.csdn.net/lihan6415151528/archive/2008/10/23/3128278.aspx
      

  5.   

    http://topic.csdn.net/u/20080929/02/4e0ef626-98ee-4d6d-96ed-fe40afe8290b.html
    好好的看一下吧,总结的很好
      

  6.   


    string是存放在string池里,但string池究竟是存入在堆中还是栈中的呢?
      

  7.   

    int a=3;这样的常量字面值是存入在栈中的,
    按照5楼的解放,这常量又是存入在常量池中,所以常量池应该是在栈中吧,因此String池也就在栈中了,请大家帮忙看看是这样的解释对吗?
      

  8.   

    String s1 = new String("s1") ;
    String s2 = new String("s1") ;
    上面创建了几个String对象?
    答案:3个 ,编译期Constant Pool中创建1个,运行期heap中创建2个.
    string str2 = new String("abc")
    创建了2个对象,编译期Constant Pool中创建1个,运行期heap中创建一个pool中只要有相同值的只创建一次。heap中有相同值的,在heap中都开辟内存空间,后面开辟的是指向第一个开辟的引用(即指针)另外,基本数据类型是存在stack中,对象类型是存在heap中
      

  9.   

    我记得基本数据类型是存在常量存储区(constant storage),栈(stack)存的是对象的引用吧
      

  10.   

    如果对别人的说法有怀疑,最好自己参考jvm规范。
    jvm把字符串常量和其他基本类型字面常量放入常量池里面是出于自己对性能的考虑,这不是使用java编程的时候需要考虑的。或者说程序员不应该对这种机制有依赖。
    不过它怎么存的,知道比较字符串内容的时候使用equals()方法而不要用==就可以了,别的根本没什么意义。
    再有就是不要用new来创建字符串即可。
      

  11.   

    这个让我想起前面我做的一个面试题,我也想问一下了,java中的包装类也是这样的吗;
    比如  Boolean a=new Boolean(true);
          Boolean b=new Boolean(true);
    他的这个存储方式也是和String方式一个意思,使得 a==b为真;
      还是因为 Boolean的equals方法的原因;
      

  12.   

    不一样的。
    String是jvm的一个处理机制。
    而Boolean,Short,Byte里面用的是静态缓存机制,可以理解为享元模式的体现.
    Boolean a=new Boolean(true);
    Boolean b=new Boolean(true);
    这样得到的a,b不是一样的.建议使用Boolean valueOf(true);这样得到的是同一个对象.
      

  13.   

    池是一个逻辑概念吧, 无所谓存到哪儿,反正是能很快存取就可以了.基本上应该是在栈中.
    String s1 = "abc";
    String s2 = "abc";
    String s3 = new String("abcd");
    System.out.println(s1.hashCode() + "," + s2.hashCode() + "," + s3.hashCode());
      

  14.   

    Java堆和栈的区别 http://www.blogjava.net/beansoft/archive/2007/09/12/143551.html
      

  15.   

    string str="abc"应该在堆中,好像不是基本数据类型吧
      

  16.   

    第一个问题我倒是真不知道,期待高手。
    第二个问题:string str2 = new String("abc")
    如果对象池中没有"abc"这个字符串,则首先在字符串池中创建一个对象,然后再在堆中创建一个对象,其值也是“abc”,并创建一个引用指向这个对象。
    所以说,一般创建两个对象。但也有另外一种情况,就是所谓的特殊:如果在string str2 = new String("abc")这句前面已经执行了一句String str = "abc" 或String aa = new String("abc") ; 或其他类似的使字符串池中已经有了"abc"时,string str2 = new String("abc")这句只创建一个
    对象,即在堆中创建的那个。
      

  17.   

    第2个问题那天看的大企鹅和猴子的BLOG,应该2个都是在堆中
      

  18.   

    可以接贴了!
    不能说创建了几个对象,这需要看你怎么理解对象的含义。说创建一个对象的,他只说new的算对象,其他的不算。说创建2个的,也没错,他把万事万物都看做对象了,他把引用和new出来的都看成了对象。
    你要明白heap就是一个特殊的stack。引用,局部变量,参数(形),return返回的,他们都放在栈中,new出来的放在heap中。
    stack中的引用保存的是heap中对象的地址,也就是引用指向heap内存楼主可以加分了
      

  19.   

    在程序执行的时候,Constant Pool会储存在Method Area,而不是heap中
    ----------
    前边大哥的贴里(http://topic.csdn.net/u/20080929/02/4e0ef626-98ee-4d6d-96ed-fe40afe8290b.html)
    有一句这个