一个问题引发的思考(基本数据类型为什么不存放在堆中?)
在看到这个问题的时候内心有点小惊讶,因为跟我之前理解的不一样,那么基本数据类型到底存放在哪儿呢?在此我结合现有的知识谈谈我的理解。
基本数据类型的值放在栈中,那么栈中的该基本数据类型变量从哪儿来的呢?我认为是从方法区来。我们都知道栈的生命周期决定于线程,那基本数据类型的值存放在栈中当线程完成的时候被销毁怎么办?这个不用担心,因为一个程序中再多的线程都是从主线程创建来的,所以真正的业务逻辑肯定是在主线程中,而创建线程的目的就是完成某一个功能或者模块,那么很显然,开辟的这个线程要么完成了它的使命就直接销毁(过程中可能有持久化,但是当线程完成的时候持久化也完成了,要线程的状态何用),要么完成了以后会产生一个状态,在主线程或者其他线程要用,此时就可以让被创建的线程将得到的最终状态返回到主线程或者其他线程,那么原来被创建的线程的状态也就没有了价值,要他的状态何用。因此基本数据类型的值存放在栈中并没有什么不妥。
解决了原问题所产生的疑惑,那么引用类型为什么不存放在栈中呢?
首先引用类型是存放在堆中,栈内存归线程所有,线程的主要目的在于逻辑,而栈就很自然的承担了逻辑的职责。有一点我相信大家都清楚,引用类型往往占用相对较大的内存空间,如果将引用类型直接存放到栈中,很显然剥夺了栈所承载的逻辑的职责,此时就可以将引用类型存放在堆中,然后在栈中引用,这在逻辑上与存放在栈中是一样的,但是这种方式在设计上是非常出色的,将逻辑与数据做了很好的解耦。