栈(stack)、堆(heap)和静态区(static area)的用法区别?很多初学java同学可能都不是很熟悉,这也是最经常遇到的一个基础java面试题,不管原来知道不知道,现在告诉你,赶紧记牢面试无忧!
* 通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;
* 通过new关键字和构造器创建的对象放在堆空间;
* 程序中的字面量(literal)如直接书写的100、"hello"和常量都是放在静态区中。
* 栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。
Eg: String str = new String("hello");
上面的语句中变量str放在栈上,用new创建出来的字符串对象放在堆上,而"hello"这个字面量放在静态区。
补充:较新版本的Java(从Java 6的某个更新开始)中使用了一项叫"逃逸分析"的技术,可以将一些局部对象放在栈上以提升对象的操作性能。
* 栈是一个先入后出(FILO:First In Last Out)的有序列表。
* 栈(Stack)是限制线性表中元素的插入和删除只能在同一端进行的一种特殊线性表。
* 允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
* 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶
* 而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除
堆(heap)实为二叉树的一种,分为最小堆和最大堆,具有以下性质:
* 任意节点小于/大于它的所有后裔,最小/大元在堆的根上。
* 堆总是一棵完全二叉树
* 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
* 方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
* 方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
* 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
以上是思博网络为广大奔走在面试以及学习阶段的java同行整理的关于Java 栈(stack)、堆(heap)和静态区(static area)可能遇到的面试问题以及重要知识点,可能存在不足或者需要补充,您有什么观点和认识,欢迎指正补充,大家一起快乐学Java,高薪在就业!
如果遇到什么疑问或者困惑,可以联系我们,乐于与您分享讨论!
即刻预约
免费试听-咨询课程-获取免费资料