一:数组的动态初始化及java运行过程
1:数组的动态初始化,只指定数组长度,初始值由系统提供默认值
2:学习java的运行能加深我们对代码的理解。
java程序为了提高程序效率,就对数据进行了不同空间的分配。具体是划分了如下5个内存空间
例:int[] arr=new int[3]
栈:栈内存存放的是局部变量;栈内存的数据在其代码块使用完毕后就释放掉。即int[] arr
堆:存放的是 所有new出来的东西,即new int[3]
特点:1:每一个new出来的东西都有地址值,也就是栈中的arr输出时输出的是其在堆中的地址,如下图输出
2:每个变量都有默认值,如申请数组动态变量时,只确定了数组的长度,那么数组的初始量就被初始化为默认值
byte,short,long,int:初始值为0 float、double:初始值为0.0 char:初始值为‘\u0000’
boolean初始值为false 引用类型:null
3: 使用完毕后就变成了垃圾,但是并没有立即回收,会在垃圾回收器空闲的时候回收
栈内存中两个引用同时指向堆内同一个内存空间时,无论是他们谁操作,都针对同一个地址
例如:int[] arr=new int[3] int[] arr1=arr arr1[0]=100 输出arr[0]的值为100,是因为将arr的地址给了arr1
方法区:对于数据变量即基本类型来说方法区存放的是类中的各个方法,然后再根据在main方法中出现的顺序依次在栈中为其分配内存空进,进而进行操作,在某一方法中对其数据进行操作时,这个变量如果也出现在其他方法中,其他方法中该变量不会因为此方法的改变而改变,因为各个方法在栈中是独立的内存空间。
方法区影响方法的调用即参数传递问题:
基本类型:形参的改变对实参没有影响
引用类型(地址数据):形参的改变直接影响实参
(后面博客还会对方法区进行补充讲解)
本地方法区:和系统相关
寄存器:cpu使用
二:数组的静态初始化
数组静态初始化指定每个元素的初始值,由系统决定数组长度.
int[] arr={1,2,3};
三:数组常见错误
ArrayIndexOutOfBoundsException:数组索引越界异常 原因:访问了不存在的索引
NullPointerException:空指针异常 原因:arr指向堆得地址已不存在,无法访问堆内数据
不能同时动态和静态初始化
四:二维数组
数据类型[][] 数组名=new 数据类型 [m][n]
或:数据类型 数组名[][]=new 数据类型[m[n]
数据类型[] 数组名[]=new 数据类型[m][n]
动态为二维数组中一维数组分配空间的过程如下:
二维数组一个编号表示地址,两个编号表示数据