Java中堆和栈上分别存储什么数据呢?
下文笔者讲述Java中堆栈上分别存储数据简介说明,如下所示:
栈上数据
基本数据类型(boolean、byte、char、short、int、float、long、double) 对象引用(reference 类型 此处不是对象本身,而是对象的指针,指向对象的地址)
堆上数据
普通对象:各种类的实例 数组:数组是一种特殊类型的对象,可以存储多个相同类型的元素。 基本类型包装器对象: Java提供一些基本类型的包装器类 如 Integer、Double、Character 等。
栈和堆内存上数据特点说明
栈上数据结构特点是先进后出 函数调用栈从下到上增长 每当函数执行时 会在栈顶部分分配一块连续的内存 称为帧 这个帧存储当前函数的通用寄存器和当前函数的局部变量的上下文信息。下面给出一个简单的 Java 函数调用,我们分析一下这个过程: public class StackExample { public static void main(String[] args) { int result = add(8, 12); System.out.println("结果是: " + result); } public static int add(int a, int b) { return a + b; } }
在这个例子中 `main`函数调用了`add`函数 当`main`函数开始执行时, 会在栈内存中为`main`函数分配一块空间, 包括局部变量`result`和参数`args` 当`main`函数调用`add`函数 此时会在栈内存中为`add`函数分配另一块空间 包括局部变量`a`、`b`和返回地址 当`add`函数执行完毕后 其占用的栈空间会被释放 控制权返回给`main`函数 最后,`main`函数执行完毕,整个程序结束
注意事项: 函数在编译时,就知道其占用的大小 只有确定大小,才能将其放置到栈上
堆简介
有些不能安全存放在栈上的数据 jvm会将其放在堆上 例:Arraylist这种数据类型会放在堆上例
import java.util.ArrayList; public class VariableLengthArrayExample { public static void main(String[] args) { // 创建一个空的 ArrayList ArrayList<Integer> arrayList = new ArrayList<>(); // 向 ArrayList 中添加元素 arrayList.add(1); arrayList.add(2); arrayList.add(3); // 输出 ArrayList 的大小 System.out.println("Size of the ArrayList: " + arrayList.size()); // 访问 ArrayList 中的元素 for (int i = 0; i < arrayList.size(); i++) { System.out.println("Element at index " + i + ": " + arrayList.get(i)); } // 删除 ArrayList 中的一个元素 arrayList.remove(1); // 再次输出 ArrayList 的大小和内容 System.out.println("Size of the ArrayList after removal: " + arrayList.size()); for (int i = 0; i < arrayList.size(); i++) { System.out.println("Element at index " + i + ": " + arrayList.get(i)); } } }
程序说明
当创建ArrayList时 程序需动态分配内存 当数组的实际使用量超过了这个容量 程序会分配一个更大的内存块,将现有元素复制到其中,添加新元素,然后释放旧内存
栈上存储的数据是静态的 大小固定,生命周期固定, 线程隔离不能跨栈引用(涉及跨栈引用的数据,会放入到堆中) 堆上存储的数据是动态的 不固定大小、不固定生命周期 线程共享可以跨栈引用
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。