Java中的栈和堆的含义
栈
存储局部变量:栈主要用于存储方法中的局部变量,包括基本数据类型(int、double、boolean等)和对象的引用(不包含对象本身)。
遵循后进先出原则:当一个方法被调用时,该方法的局部变量和参数会被压入栈中,这些变量会按照相反的顺序从栈中弹出。
大小固定:栈的大小在程序启动时就已经确定,并且在运行过程中不会改变,如果栈溢出,会出StackOverflowError异常
特点:
快速访问:栈中的数据访问速度非常快,因为数据的存储和访问只涉及到简单的指针操作
内存管理简单:栈中的内存由系统自动分配和释放
堆
存储对象:堆用于存储通过new关键字创建的对象和数组。这些对象在堆中分配内存,并由垃圾回收器管理。
动态分配:堆的大小在程序运行时可以动态变化。当创建新的对象时,堆会分配足够的内存来存储这些对象。如果堆内存不足,会抛出OutfMemoryError异常
特点:
相对较慢的访问速度:相对于栈,堆中的数据访问速度较慢,因为需要通过指针来定位对象,并且堆中的数据较为分散
需要垃圾回收:堆中的对象不再被引用时,需要由垃圾回收器来回收其占用的内存。
请问这段代码在内存中是怎么存储的?
public class Main {
public static void main(String[] args) {
int[] array={1,2,3,4};
}
}
图如下:
解释:
因为数组是引用类型,那么什么是引用类型呢
引用类型存储的是存储的是对象在内存中的地址,对象是存储在堆中。
那么回归本问题,这个数组指向了一个对象地址即0x98(在堆山),因此在栈中的数组引用变量存储的值是堆中数组对象的地址。通过访问对象的地址,进而可以访问和修改这个地址中的元素。
请问这段代码输出的是什么
public static void func1(int[] array1){
array1=new int[10];
}
public static void main(String[] args) {
int[] array={1,2,3,4};
func1(array);
for (int i = 0; i <array.length ; i++) {
System.out.print(array[i]+" ");
}
System.out.println();
}
结果依旧是1 2 3 5。为什么呢?
首先,array数组指向了一个对象的地址即0x98,进行方法传参后,array1的刚开始指向对象的地址是0x98,而又创建了一个数组array1,所以指向的对象的地址发生了改变,不再是0x98,而是0x88,所以对array1的元素更改并不会影响array的元素,所以array输出的依旧是1 2 3 4
请问这段代码输出的是什么
public class Main {
public static void func2(int[] array1){
array1[0]=99;
}
public static void main(String[] args) {
int[] array={1,2,3,4};
func2(array);
for (int i = 0; i <array.length ; i++) {
System.out.print(array[i]+" ");
}
System.out.println();
}
}
输出的是 99,2,3,4
解释
array首先指向对象的地址是0x97,在方法传参后,把对象的地址给了array1,因为这俩个数组都指向了同一个对象,所以array1对对象值的更改会影响到array,所以最后输出的是99 2 3 4
结语:限于水平,本篇文章不足之处在所难免,还望大家见谅,如有错误,请指正下,谢谢大家!!!