共计 1161 个字符,预计需要花费 3 分钟才能阅读完成。
为什么要把堆和栈辨别进去呢?
第一,从软件设计的角度看,栈代表了解决逻辑,而堆代表了数据。这样离开,使得解决逻辑更为清晰。分而治之的思维。这种隔离、模块化的思维在软件设计的方方面面都有体现。
第二,堆与栈的拆散,使得堆中的内容能够被多个栈共享(也能够了解为多个线程拜访同一个对象)。这种共享的收益是很多的。一方面这种共享提供了一种无效的数据交互方式 (如:共享内存),另一方面,堆中的共享常量和缓存能够被所有栈拜访,节俭了空间。
第三,栈因为运行时的须要,比方保留零碎运行的上下文,须要进行地址段的划分。因为栈只能向上增长,因而就会限制住栈存储内容的能力。而堆不同,堆中的对象是能够依据须要动静增长的,因而栈和堆的拆分,使得动静增长成为可能,相应栈中只需记录堆中的一个地址即可。
第四,面向对象就是堆和栈的完满联合。其实,面向对象形式的程序与以前结构化的程序在执行上没有任何区别。
然而,面向对象的引入,使得看待问题的思考形式产生了扭转,而更靠近于天然形式的思考。当咱们把对象拆开,你会发现,对象的属性其实就是数据,寄存在堆中;而对象的行为(办法),就是运行逻辑,放在栈中。咱们在编写对象的时候,其实即编写了数据结构,也编写的解决数据的逻辑。不得不抵赖,面向对象的设计,的确很美。
在 Java 中,Main 函数就是栈的起始点,也是程序的起始点。
程序要运行总是有一个终点的。同 C 语言一样,java 中的 Main 就是那个终点。无论什么 java 程序,找到 main 就找到了程序执行的入口。
堆中存什么?栈中存什么?
堆中存的是对象。栈中存的是根本数据类型和堆中对象的援用。一个对象的大小是不可预计的,或者说是能够动态变化的,然而在栈中,一个对象只对应了一个 4 btye 的援用(堆栈拆散的益处)。
为什么不把根本类型放堆中呢?
因为其占用的空间个别是 1~8 个字节——须要空间比拟少,而且因为是根本类型,所以不会呈现动静增长的状况——长度固定,因而栈中存储就够了,如果把他存在堆中是没有什么意义的(还会节约空间,前面阐明)。
能够这么说,根本类型和对象的援用都是寄存在栈中,而且都是几个字节的一个数,因而在程序运行时,他们的解决形式是对立的。然而根本类型、对象援用和对象自身就有所区别了,因为一个是栈中的数据一个是堆中的数据。最常见的一个问题就是,Java 中参数传递时的问题。
起源:https://pengjiaheng.iteye.com
近期热文举荐:
1.1,000+ 道 Java 面试题及答案整顿 (2021 最新版)
2. 别在再满屏的 if/ else 了,试试策略模式,真香!!
3. 卧槽!Java 中的 xx ≠ null 是什么新语法?
4.Spring Boot 2.5 重磅公布,光明模式太炸了!
5.《Java 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!