关于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。