请用最通俗的形像的语言解释JAVA中的堆和栈

作者&投稿:雀政 (若有异议请与网页底部的电邮联系)
请简单通俗易懂的解释一下在Java中什么叫堆 什么叫栈 谢谢~

堆:也叫动态内存,相当于一个内存池子,在java中创建对象的时候,就从堆里面拿出一块来存放对象;当GC(垃圾回收)回收对象的时候,又把对象占用的内容还给堆。

举个例子:堆就好比一个面团,类就好比一个馒头印子,用印子从面团中取出一小块面团,印成馒头,这个馒头就是这个馒头印子类产生的对象了。当无限的创建馒头的时候,这个面团总会被用光的,这个时候就不能在创建新的馒头了。
所有GC就有存在的必要了,当对象不被持有的时候,GC就会把对象还给堆。也就是,当这个馒头没有被使用,这个馒头就变成小面团,还给面团。

栈:也是一段内存,但是这段内存比较有特点,遵循一个先进后出的规则。

举个例子:吃过罐装的薯片吧,薯片一片一片的放到罐里面去,想想,最先放进去的是不是放在罐的最底部。现在一片片把薯片取出来,是不是要从最顶部开始去,也就是最后放进去的,最先取出来。这个薯片放进去和取出来的这个过程,就是栈的工作原理啦(先进入的后出来,后进入的先出来)


在java中的栈:栈的原理明白了,其实只要是计算机只要是编程语言,什么堆什么栈都是一样的,基本作用也一样。java中可以认为,栈用来存放局部变量的。
public void fun(){
int i=0; //i 是一个局部变量,存放在栈里面的
Object obj = new Objec(); //obj 是一个对象应用,同样也是一个局部变量,存放在站里面的,但是obj指向的对象,在存在堆中
}

java堆栈类源程序import java.util.LinkedList;import java.io.*;import java.util.NoSuchElementException;/** * * @version 1.00 06/12/19 */public class MStack { LinkedList list; public MStack() { list=new LinkedList(); } public static void main(String[] args) { MStack MStack=new MStack(); MStack.push("ok"); MStack.push("i am ok"); System.out.println(MStack.pop()); System.out.println(MStack.pop()); System.out.println(MStack.pop()); } //弹出元素 public Object pop() { try { Object o=list.getFirst(); list.removeFirst(); return o; } catch(NoSuchElementException e) { //System.out.println(e); return null; } } //压入元素 public void push(Object o) { list.addFirst(o); } //得到栈顶元素 public Object getTop() { if(list.size()!=0) { return list.getFirst(); } else { return null; } } }Junit测试程序import junit.framework.*;public class TestMStack extends TestCase{ MStack s=new MStack(); public TestMStack(String name) { super(name); } public void setUp() { } public void testCase1() { MStack MStack=new MStack(); s.push("ok"); MStack.push("ok"); Assert.assertEquals(s.getTop(),MStack.getTop()); } public static void main(String[] args) { junit.textui.TestRunner.run(TestMStack.class); } }// http://blog.csdn.net/wfisone/archive/2009/05/09/4163778.aspx

Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等 指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时 动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类 型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。

栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
int a = 3;
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。

这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。

要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。

String是一个特殊的包装类数据。可以用:
String str = new String("abc");
String str = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。

比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的。

String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new的方式是生成不同的对象。每一次生成一个。

因此用第一种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。

另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。
由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。

1

堆是存放物品的柜子,其中柜子中有很多抽屉,抽屉上表名了具体的地址号码,而栈是就是指向了这些地址号码,要用到物品的时候,调用就OK啦,这样做事情就达到高效了嘛。


如何做好思想表达的通俗化
有一种情形是,人们通过对某种道理的通俗表达而看透了这种道理的并不深刻,那不是文字通俗的罪过。假如某种思想历来是被艰深的文字所包裹着的,因而也历来得到了“深刻”的名声。长期地并无人来质疑,因为人们大多受阻或忌惮于它的艰深晦涩的文字外衣。但是,假如有一天,有人用通俗的语言表达了这同一个...

吸引客流的话术
通俗易懂的语言是最容易被大家所接受,因此我们尽量不要说非常专业性的话语,以免让顾客听不懂,从到导致沟通障碍,听不懂就会对商品产生疑惑,有疑惑就可能会影响购买。因此我们要学会用顾客听得懂的方式来交流,简洁明了最好,不要装的一副很高级的样子,接地气才是最好的。 2、生动形象的描绘 跟顾客交流的时候不...

请高手用通俗的语言说一下,直线拟合的意思,不要复制网上的,我找过了...
万能公式不一般,化为有理式居先。公式顺用和逆用,变形运用加巧用;1加余弦想余弦,1 减余弦想正弦,幂升一次角减半,升幂降次它为范;三角函数反函数,实质就是求角度,先求三角函数值,再判角取值范围;利用直角三角形,形象直观好换名,简单三角的方程,化为最简求解集;三、《不等式》解不...

介绍一种事物评语
4、未能通过小事情反映大道理,“以小见大”的表现手法运用还不够娴熟。5、对物品形象缺乏多角度的刻画,只是选取了某一狭窄的题材,片面地显现了物品某一方面的性格特征。6、能够选择生活中具有典型意义的题材,事件的代表性较强。 抢首赞 评论 分享 举报 ...

常用谚语有哪些?
俗语以形象为主体;成语以精练为特色。俗语多为完整的句子,长短不一,运用时可以变通;成语多为四个字的稳定结构,形式整齐。俗语流行于人民群众的口头上,文字上保持着通俗的特点;成语多用作书面语,文字上趋向典雅。从这一比较中,可以从主要方面作出界定:俗语是以形象为主体的通俗的口语,它的结构形式相对稳定,而在...

用通俗的语言解释冷更新和热更新。
技术特点 在iOS中有两种App更新方式:一种是在AppStore内进行更新,更新时重新下载全部安装包;另一种就是热更新,用户只有在打开App时才会发现热更新包,更新时只需下载安装更新部分的代码,再次打开时即可。热更新最大的优点就是快,它可以绕过苹果方面的审核,更新通常只需一个晚上即可上线,另一大...

马云说过一句话:赚钱有三种人,一种是生意人,一种是商人,一种是企业家...
马云说过的正确话是:“在我看来有三种人,生意人:创造钱;商人:有所为,有所不为。企业家:为社会承担责任。企业家应该为社会创造环境。企业家必须要有创新的精神。 ”素有“骗子、疯子、狂人”之称的马云善于用最简短、最形象、最通俗的语言表达深刻的成功哲学。他在CCTV《赢在中国》现场征服了...

小学语文阅读总复习(一)
这样的题目,句子中往往有一个词语或短语用了比喻、对比、借代、象征等表现方法。答题时,把它们所指的对象揭示出来,再疏通句子,就可以了。(四)某句话中某个词换成另一个行吗?为什么?动词:不行。因为该词准确生动具体地写出了……形容词:不行。因为该词生动形象地描写了……副词(如都,...

谁能用通俗点形象的点的语言来解释一下这个function与var问题?!_百度...
function fun() {}这种定义方式解释优先级会高于var fun = function() {};这是问题的关键,举个例字,fun();function fun() {alert(1)} 这样不会出错,而 fun();var fun = function() {alert(1)} 就会出错 因为会先解释function fun() {},你写这个例子同样的,先解释function fun() ...

所有俗语
24、俗话说:书到用时方恨少;可俗话又说:百无一用是书生!25、俗话说:金钱不是万能的;可俗话又说:有钱能使鬼推磨!26、俗话说:天无绝人之路;可俗话又说:天网恢恢,疏而不漏!27、俗话说:出淤泥而不染;可俗话又说:近朱者赤,近墨者黑!28、俗话说:捉贼捉赃,捉奸捉双;可俗话又说:欲加之罪,何患无辞!

龙泉市18921701341: JAVA谁能用简单通俗的语言解释哈是什么吗? -
颜胃力斯: 1、Java语言是简单的.Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java.另一方面,Java丢弃了C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换.特...

龙泉市18921701341: 谁能用最简单且具体的语言描述一下java是什么啊? -
颜胃力斯: Java是Sun公司开发的一种语言,最早用于芯片级的编程,后来发展成为了主流的编程语言,就像微软的VB,C++语言一样,用来让程序开发程序使用的语言.在语法上和C#最像.不过,Java后台都是有Java虚拟机支撑的,也就是说,只要有虚拟机,在任何操作系统上,在任何电脑上,在任何芯片上都能执行Java语言编写的程序.

龙泉市18921701341: 用通俗的话说说Java到底是什么 -
颜胃力斯: 一种编程时 使用的语言而已 可能迷惑你的 是你在手机上经常看到JAVA 吧.其实那个是JAVA虚拟机.因为JAVA语言 要在JAVA虚拟机下才可以运行的..有什么不明白的 还可以继续来问我!

龙泉市18921701341: JAVA到底是什么 怎么用 用最通俗的话解释 -
颜胃力斯: JAVA是一种编程语言,建立在JVM虚拟机的基础上的.更多内容请看百度百科.JAVA编程需要学习JAVA语言以及面向对象等,JAVA是一种面向对象的跨平台的语言,它编出的程序可以执行在不同的平台上,当然手机也是一方面.那是JAVAME的部分.JAVA使用需要安装java虚拟机,也就是在有java的环境下编程,需要安装的软件有jdk和jre.在sun公司主页有下载.安装了这个以后就可以进行JAVA编程了,编辑完以后就可以运行在所有java平台下

龙泉市18921701341: 常听到或看到Java通俗点说是什么呀?干什么用?
颜胃力斯: JAVA是个面向网络的程序设计语言,用来让程序员创建应用程序,这些应用程序可以通过网络下载,而且可在任何计算平台上安全地运行.如果再加上万维网和公司内部...

龙泉市18921701341: java是什么?我要通俗一点的解释!
颜胃力斯: 一种手机支持的软件格式,好比MP3,MP4格式一样,你下载支持java的的软件程序就可以使用了

龙泉市18921701341: 请用最通俗的形像的语言解释JAVA中的堆和栈 -
颜胃力斯: Java 中的堆和栈简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空...

龙泉市18921701341: java是什么意思(通俗点讲) -
颜胃力斯: 是一个网页跟手机可以支持部分网页和游戏动态加载必须的程序,反正安装就对了哈哈哈!也不占什么地方

龙泉市18921701341: JAVA语言介绍 -
颜胃力斯: 1995年,美国Sun Microsystems公司正式向IT业界推出了java语言,该语言具有安全、跨平台、面向对象、简单、适用于网络等显著特点,当时以web为主要形式的互联网正在迅猛发展,java语言的出现迅速引起所有程序员和软件公司的极大关...

龙泉市18921701341: 什么是JAVA程序
颜胃力斯: Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动感的Web、Internet计算.从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器现在均支持Java applet.另一方面,Java技术也不断更新.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网