请问两者都是什么样的数据结构,如何存储?有何区别?

解决方案 »

  1.   

    堆是自由存储,同一 JVM 中的线程共享。
    栈是后进先出,每个线程有一个自己的栈。
      

  2.   

    从数据结构上来说,栈的优势是,存取速度比堆快,缺点是存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享。
    堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,java垃圾回收器会自动收走这些不再使用的数据。缺点是,由于要在运行时动态分配内存,存取速度较慢。
      

  3.   

    new出来的object存在堆上, 堆是共享的
    而栈每个线程有一个,像函数参数之类的存储等(入栈、出栈...)
      

  4.   

    基本类型的变量和对象的引用变量都是在函数的栈内存中分配
    堆内存用来存放由new创建的对象和数组,在堆中分配的内存,由java虚拟机的自动垃圾回收器来管理
      

  5.   

    new申请的用堆
    普通变量和对象用栈
      

  6.   

    这些概念还是在学C++的时候遇到的.大家可能也知道因为C++里面的指针是个很麻烦的东西.它和变量、常量、字符串、数组、函数、指针本身等结合起来不知道有多麻烦。
      这里只说说程序在内存中如何分配的吧:
      1.代码区-存放程序的代码,即程序中的各个函数代码块
      2.全局数据区-存放程序的全局数据和静态数据
      3.堆区-存放程序的动态数据
      4.栈区-存放程序的局部数据,即各个函数中的数据
    栈对与函数调用和递归是很有用的,比如你定义的函数的参数存放地址,返回地址,在栈里是有严格的顺序的;堆在程序运行的时候分配,堆内存也称动态内存,在C语言里有malloc()和free()两个函数,C++里有new和delete关键字,Java里只有new了,程序运行完毕,堆也不存在了(除非你漏写了free()或者delete).所以觉得能精通C或者C++很牛,也很不容易~
      

  7.   

    还有,堆和栈的空间也不一样,在v++中,通常情况下栈的空间只有1M,如果大于1m,程序运行就出错了。而堆就可以更大些,没有这样的限制。
    我想java 也应该是这样。