面试官:为什么 Java 不把基本类型放在堆中?我竟然答不上来。。

Java之间

共 1474字,需浏览 3分钟

 · 2021-11-21

往期热门文章:
1、IDEA 注释模板这样搞!
2、后端开挂:3行代码写出8个接口!
3、推荐一款可视化配置 Nginx 的神器
4、一款性能调优利器 — 火焰图
5、Redis 实现限流的三种方式

为什么要把堆和栈区分出来呢?

第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。
第二,堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)。这种共享的收益是很多的。一方面这种共享提供了一种有效的数据交互方式(如:共享内存),另一方面,堆中的共享常量和缓存可以被所有栈访问,节省了空间。
第三,栈因为运行时的需要,比如保存系统运行的上下文,需要进行地址段的划分。由于栈只能向上增长,因此就会限制住栈存储内容的能力。而堆不同,堆中的对象是可以根据需要动态增长的,因此栈和堆的拆分,使得动态增长成为可能,相应栈中只需记录堆中的一个地址即可。
第四,面向对象就是堆和栈的完美结合。其实,面向对象方式的程序与以前结构化的程序在执行上没有任何区别。
但是,面向对象的引入,使得对待问题的思考方式发生了改变,而更接近于自然方式的思考。当我们把对象拆开,你会发现,对象的属性其实就是数据,存放在堆中;而对象的行为(方法),就是运行逻辑,放在栈中。我们在编写对象的时候,其实即编写了数据结构,也编写的处理数据的逻辑。不得不承认,面向对象的设计,确实很美。
在 Java 中,Main 函数就是栈的起始点,也是程序的起始点。
程序要运行总是有一个起点的。同 C 语言一样,java 中的 Main 就是那个起点。无论什么 java 程序,找到 main 就找到了程序执行的入口。

堆中存什么?栈中存什么?

堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。一个对象的大小是不可估计的,或者说是可以动态变化的,但是在栈中,一个对象只对应了一个 4 btye 的引用(堆栈分离的好处)。

为什么不把基本类型放堆中呢?

因为其占用的空间一般是 1~8 个字节——需要空间比较少,而且因为是基本类型,所以不会出现动态增长的情况——长度固定,因此栈中存储就够了,如果把他存在堆中是没有什么意义的(还会浪费空间,后面说明)。
可以这么说,基本类型和对象的引用都是存放在栈中,而且都是几个字节的一个数,因此在程序运行时,他们的处理方式是统一的。但是基本类型、对象引用和对象本身就有所区别了,因为一个是栈中的数据一个是堆中的数据。最常见的一个问题就是,Java 中参数传递时的问题。
来源:https://pengjiaheng.iteye.com

最近热文阅读:

1、IDEA 注释模板这样搞!
2、后端开挂:3行代码写出8个接口!
3、推荐一款可视化配置 Nginx 的神器
4、一款性能调优利器 — 火焰图
5、Redis 实现限流的三种方式
6、推荐 15 款常用开发工具
7、一次 QPS 翻倍的 Java 服务性能优化
8、Maven 划分模块最佳实践
9、面试官问:select......for update会锁表还是锁行?
10、Spring Boot + GraphQL 才是 API 的未来!
关注公众号,你想要的Java都在这里

浏览 28
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报