关于java栈和堆

发布时间:2024年01月05日

关于java栈和堆

在上一篇文章中我们了解了数组的声明和创建,本篇文章中我们了解一下声明数组,创建数组,给数组赋值以后,栈和堆都是怎么样子分配的,了解一下底层的逻辑知识,让大家可以更好的理解数组😀。

首先我们来回顾一下数组的声明,创建,以及赋值。

数组

public class Demo
{
    public static void main(String[] args)
    {
        int[] array;//首选  声明一个数组

        //int array1[];// C和C++采用

        array =new int[10];//存放10个int类型的数字  创建一个数组

        //给数组元素赋值
        array[0]=1;
        array[1]=2;
        array[2]=3;
        array[3]=4;
        array[4]=5;
        array[5]=6;
        array[6]=7;
        array[7]=8;
        array[8]=9;
        array[9]=100;
    }
}

java内存

在这里插入图片描述

栈和堆

我们逐步来了解,从声明到赋值,栈和堆的分配。

1、声明数组

声明数组以后,在栈中分配了一块空间,数组名字为array,数据类型为int类型。

在这里插入图片描述

2、创建数组

创建数组,new一个数组的对象,new了以后,就会在堆里面分配一块空间。

在这里插入图片描述

3、数组赋值

我们创建了一个长度是10的数组,但是由于索引从0开始,所以真实的顺序是0-9,我们为0-9赋值,所以在刚刚分配的大空间中,又分配了10个小空间。

在这里插入图片描述

4、下标越界

下标的合法区间[0,length-1],如果越界就会报错

public class Demo
{
    public static void main(String[] args)
    {
        int[] array;//首选  声明一个数组

        //int array1[];// C和C++采用

        array =new int[10];//存放10个int类型的数字  创建一个数组

        //给数组元素赋值
        array[0]=1;
        array[1]=2;
        array[2]=3;
        array[3]=4;
        array[4]=5;
        array[5]=6;
        array[6]=7;
        array[7]=8;
        array[8]=9;
        array[9]=100;
    }
}

我们上面定义的范围是10个,下标最后一个是9,如果我们要输出下标是10的数组,就会提示报错!

public class Demo
{
    public static void main(String[] args)
    {
        int[] array;//首选  声明一个数组

        //int array1[];// C和C++采用

        array =new int[10];//存放10个int类型的数字  创建一个数组

        //给数组元素赋值
        array[0]=1;
        array[1]=2;
        array[2]=3;
        array[3]=4;
        array[4]=5;
        array[5]=6;
        array[6]=7;
        array[7]=8;
        array[8]=9;
        array[9]=100;
        
        System.out.println(array[10]);
    }
}

我们执行以下上面的代码,就会看到以下的报错。

ArrayIndexOutOfBoundsException 
  • 这个报错的意思就是,数组下标越界异常
  • 因为我们只分配了10个小空间,长度范围已经固定在10了,输出11的时候,它不在我们创建的空间内,所以抛出异常提示,在以后的工作中,如果发现了这个字样,第一时间要去看一下 数组的长度🤔

初始化数组

初始化数组一共有三种方式😀。

1、静态初始化
  • 数据类型[] + 数组名字 = {值…};
public class Demo {
    public static void main(String[] args) 
    {
        //静态初始化数组 创建加赋值
        int[] b={1,2,3,4,5};

        System.out.println(b[0]);
    }
}
2、静态初始化2(当前仅需要了解)
  • 需要先新建一个类,类名我们就叫做One。
  • 类名[] + 数组名 = {new 类名(1,1),new类名(2,2)};
public class Demo {
    public static void main(String[] args)
    {
        One[] ones = {new One(1,1),new One(2,2)};
   
    }
}
3、动态初始化
  • 动态初始化就是我们上面那种方式
  • 数据类型[] + 数组名字 = new 数据类型[范围];
public class Demo {
    public static void main(String[] args)
    {
   		int[] a = new int[2];
   		int[0]=1;
   		int[1]=2;
    }
}
4、数组的默认初始化
  • 数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。

总结

  • 数组是相同数据类型(数据类型可以为任意类型)的有序集合数组也是对象。
  • 数组元素相当于对象的成员变量。
  • 数组长度的确定的,不可变的。如果越界,则报:ArraylndexOutofBounds。
文章来源:https://blog.csdn.net/SpringYang11/article/details/135414375
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。