当前位置: 首页 > 后端技术 > Java

面试官:为什么Java不把原始类型放在堆上?我什至无法回答,.

时间:2023-04-01 21:11:55 Java

为什么要区分堆和栈?首先,从软件设计的角度来看,栈代表处理逻辑,而堆代表数据。这种分离使得处理逻辑更加清晰。分而治之的思维。这种隔离和模块化的思想体现在软件设计的方方面面。其次,堆和栈的分离使得堆的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)。这种分享的好处有很多。这种共享一方面提供了一种有效的数据交互方式(如:共享内存),另一方面堆中的共享常量和缓存可以被所有栈访问,节省了空间。第三,由于运行时的需要,需要将栈分成地址段,比如保存系统运行的上下文。由于堆栈只能向上增长,因此限制了堆栈存储内容的能力。堆是不同的。堆中的对象可以根据需要动态增长。因此,栈和堆的分裂使得动态增长成为可能。对应的栈只需要在堆中记录一个地址即可。第四,面向对象是堆和栈的完美结合。事实上,面向对象的程序和以前的结构化程序在执行上没有区别。但是,面向对象的引入改变了思考问题的方式,更接近于自然的思维方式。当我们拆解对象时,会发现对象的属性其实就是数据,存储在堆中;而对象的行为(方法)是运行逻辑并被放入栈中。当我们写一个对象的时候,我们实际上是在写数据结构和处理数据的逻辑。不得不承认面向对象设计确实很美。在Java中,Main函数是栈的起点,也是程序的起点。程序运行总是有一个起点。与C语言一样,Java中的Main就是起点。不管是什么java程序,如果找到main,就会找到程序执行的入口。堆中存储了什么?堆栈中存储了什么?对象存储在堆中。堆栈存储对堆中基本数据类型和对象的引用。一个对象的大小是不可估量的,或者是可以动态改变的,但是在栈中,一个对象只对应一个4btye的引用(栈分离的好处)。为什么不将原始类型放入堆中?因为它占用的空间一般是1到8个字节——需要的空间较少,而且因为是基本类型,不会有动态增长——长度是固定的,所以放在栈中就够了。存在于堆中是没有意义的(也会浪费空间,后面会解释)。可以说,基本类型和对象的引用都是保存在栈中的,都是几个字节的数,所以在程序运行的时候,它们的处理方式是统一的。但是基本类型、对象引用和对象本身是不一样的,因为一个是栈中的数据,一个是堆中的数据。最常见的问题之一是Java中的参数传递问题。来源:https://pengjiaheng.iteye.com近期文章推荐:1.1,000+Java面试题及答案(2021最新版)真香!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!