基础类型存放在栈上,引用类型存放在堆上,请问是为什么?
记住一句话:能量是守衡的,无非是时间换空间,空间换时间的问题
堆比栈大,栈比堆的运算速度快,对象是一个复杂的结构,并且可以自由扩展,如:数组可以无限扩充,对象可以自由添加属性。将他们放在堆中是为了不影响栈的效率。而是通过引用的方式查找到堆中的实际对象再进行操作。
相对于简单数据类型而言,简单数据类型就比较稳定,并且它只占据很小的内存。
不将简单数据类型放在堆是因为通过引用到堆中查找实际对象是要花费时间的,而这个综合成本远大于直接从栈中取得实际值的成本。
所以简单数据类型的值直接存放在栈中。
字符串是存放在栈上么?为什么
不是
因为如果一个字符串很大,在栈内存不下,只能存在字符串常量池中,被栈或堆上的变量引用。
如果变量的值是字符串字面量,则在栈上的变量直接引用字符串常量池中的字符串;如果是字符串是 new String 创建的,则会在堆上创建 String 对象,指向字符串常量池中的字符串,栈上变量指向堆中的 String 对象。
一旦它被创建,它将不会被更改。但是,许多这样的常量将被创建以供业务使用。字符串变量实际上是指常量的内存地址。当字符串的值更改时,内存地址将自动修改。