自学内容网 自学内容网

Java有关数组的相关问题

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

结语:限于水平,本篇文章不足之处在所难免,还望大家见谅,如有错误,请指正下,谢谢大家!!!


原文地址:https://blog.csdn.net/2402_86350741/article/details/144174613

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!