请问:基本数据类型是在栈中存储的,引用类型的内容是在堆中存储的。
那么int a = 1
    int b = 1;问题1:int a = 1 在栈中是怎么存储的,a代表什么,是代表引用吗?问题2:a和b在栈中是同一块地址吗?
string str1 = "test";
string str2 = "test";问题3:str1和str2的内容相同,那么str1和str2在堆中占用的是同一块地址吗?问题4:在栈中存储和在堆中存储的区别是什么?

解决方案 »

  1.   

    问题4:在栈中存储和在堆中存储的区别是什么?
    栈的速度比堆快,但是栈的控件比较小。问题3:str1和str2的内容相同,那么str1和str2在堆中占用的是同一块地址吗? 
    如果是这样创建:
    string str1 = "test";
    string str2 = "test"; 
    答案是肯定的。
    其他的方式赋值,比如:
    String str1 = "test";
    String str2 = new String("test";) 
    答案是NO。问题2:a和b在栈中是同一块地址吗? 
    不是,它们有不同的栈地址。问题1:int a = 1 在栈中是怎么存储的,a代表什么,是代表引用吗?
    是栈中一段32位的地址空间。a就代表这段地址空间。
      

  2.   

    1, a 不代表引用, 只是一个绝对地址, 大小为4字节, 在栈区间中占了4字节的空间2, 不是同一个地址, 各占4字节3, 是同一块地址. 这里要注意了, 因为String这个数据类型很特别, 如果编译器发现两个字符串类型的内容一致的话, 就只使用一个数据块, 大家共享. 这也是为了节约资源考虑.4, 区别... 说来话长了. 不过可以记住, 栈是用来存放函数中的局部变量的, 堆是存放全局或者说new出来的对象的
      

  3.   

    1 a代表内存地址,是地址的别名,这对所有语言的变量定义都是一样的,引用是java的一种说法,其实也是地址的意思2 a和b不是同一块,如果是同一块的话,你改变a和b的任意一个,那么另一个必然要变化,而现实结果是否定的。这和java的内存分配方式有关3 是同一块,因为java为了省内存,而且string是不变的,所以在分配的时候把test只分配了一个地方,所以str1和str2指向了一个地方4 我只能说两者存取方式不同,一个先进后出,一个先进先出,其他我暂时没想到。
      

  4.   

    1楼解答的很详细了。
    另外问题2,
    String str1 = "test";
    String str2 = "test";
    String str3 = new String("test");
    str1和str2是同一段内存中的引用,引用同一段空间,该空间内容为"test",——是在栈中的。
    而str3是一个String对象,内容为"test",——是在堆中的。
    显然str1==str2,str1!=str3.
      

  5.   

    public class A{
    public static void main(String[] args){
    String str1 = "test";
    String str2 = "test";
    String str3 = new String("test");
    System.out.println(str1==str2);//true
    System.out.println(str1==str3);//false
    }
    }
      

  6.   

    另外问题2,
    String str1 = "test";
    String str2 = "test";
    String str3 = new String("test");
    str1和str2是同一段内存中的引用,引用同一段空间,该空间内容为"test",——是在栈中的。
    而str3是一个String对象,内容为"test",——是在堆中的。
    显然str1==str2,str1!=str3.str1和str2是在栈中分配的吗?为什么?
      

  7.   


    补充:
    1。栈仅次于cpu寄存器,而堆是使用的内存。寄存器的速度比访问内存快。所以访问栈比访问堆速度快
    2。我认为问题2应该这样描述,a和b在栈中不是同一个地址,但是a和b指向同一个栈的空间地址
    3。问题1中,a代表的就是1在栈中的空间地址,所以a可以理解为引用
      

  8.   

    楼主是搞C#的吧???String 怎么写成了string了?
      

  9.   


    谁说堆是先进先出的啊???
    那是队列可好!!!在java中,是靠垃圾回收器回收的
      

  10.   


    对于String str1 = "test";
        String str2 = "test";
    实际上是在内存的Data Segment区域,而不是在栈中的,str1也是个引用指向Data Segment中的“test”的,同样 str2也一样
      

  11.   

    楼主是搞C#的吧???String 怎么写成了string了?
    不好意思,不是的,初学java,有好多问题。
      

  12.   

    最后谁能帮我总结一下:
      String str = "xyz";
    二  int a = 1;
      static声明的变量
    四  final声明的变量
      String str = new String("xyz") 
    分别存储到内存的哪里?
    我真的有点晕,希望有人能帮我,不胜感激!!!