数组在编程中有很高的作用,他用来存储相同数据类型的同一类数据,对编程小白来说学习数组非常重要。在以后的编程学习中占有很高的地位,对于初学者要清楚在Java中数组的定义格式、怎样存储数组元素、怎样操作数组元素、结合数组解决实际业务、数组在内存中如何存储(内存管理)等内容。
二、数组的初始化
在实际的编程中数组初始化分两种1、静态初始化数组 2、动态初始化数组
1、静态初始化数组
定义:在定义数组时直接给数组赋值
格式:数据类型 [ ] 数组名 =new 数据类型[ ]{数据1,数据2,……….};
简化格式:数据类型 [ ]数组名={数据1,数据2………};
例如:int [ ] ArraryDemo=new int [ ]{12,13,14,15,16};
double [ ] ArraryDemo=new double [ ]{12.2,13.0,16.5,17.0};
String [ ] ArraryDemo=new String [ ]{“迪丽热巴”,”哈妮克孜”,”吉克隽逸”};
***注意:数组变量名存储的是数组在内存中的地址,数组是引用类型。
2、动态初始化数组
定义:定义数组时只确定数组的长度和数据类型无需给数组赋值
格式:数据类型 [ ] 数组名=new 数据类型 [数组长度];
例如:int [] ArraryDemo=new int [10];
double [] ArraryDemo=new double[10];
String [] ArraryDemo=new String[10];
*****动态初始化数组默认值规则******
public class ArraryDemo(){
public static void main(String []args){
//整形动态数值化数组的默认值为0
int []ArraryIntDemo=new int[5];
System.out.println(ArraryIntDemo[1]);
//字符型动态数组的默认值为0
char []ArraryCharDemo=new char[5];
System.out.println((int)ArraryCharDemo[1]);
//浮点型动态初始化数组的默认值0.0
double []ArraryDoubleDemo=new double[5];
System.out.println(ArraryDoubleDemo[1]);
//布尔类型动态初始化数组的默认值false
boolen []ArraryBoolenDemo=new boolen[5];
System.out.println(ArraryBoolenDemo[1]);
//引用类型动态初始化数组默认值null
String ArraryStrDemo=new String[5];
System.out.println(ArraryStrDemo[1]);
}
}
三、数组的访问
无论是静态初始化数组还是动态初始化数组,数组的访问很简单
格式:数组名[索引值];
以静态数组为例,访问格式为
public calss MyArraryDemo{
public static void main(String args[]){
int []score=new int[]{12,13,15,19,14};
System.out.println(score[1]);
System.out.println(score[2]);
System.out.println(score[3]);
System.out.println(score[4]);
}
}
注意**:数组的索引值是从0开始的,所以score[0]的数值是12;
四、数组的长度和最大索引值
运用数组名调用length可以得出数组的长度,最大索引值是数组长度-1。
public class MyArraryDemo{
public static void main(String[] args){
int [] score = new int []{12,13,14,15,16};
//数组长度
System.out.println("数组的长度为:"+score.length);
//最大索引值
System.out.println("最大索引值"+score.length-1);
}
}
输出的数组的长度为5,最大索引值为4。
***数组的注意事项:
1、什么类型的数组存放什么类型数据
2、数组一旦被定义出来,执行过程中长度类型就固定了
3、数组的索引值不能超过数组的长度,否侧程序会报错无法运行
4、当已经知道存入的元素值时 用静态数组初始化
5、当不知道要存入数组的数据时 用动态数组初始化
五、数组的内存分配
理解数组的内存分配对学习数组至关重要,程序在运行时主要有,方法区、栈内存、堆内存,
方法区:字节码文件加载时进入的内存,例如HolloWorld.class
堆内存:new出来的东西会在这块内存中开辟空间并产生地址
栈内存:方法运行时所进入的内存,另外变量也在这里。
public class ArrMemory(){
public static void main(String args[]){
int i=5;//普通变量所存储的就是他本身的值
int []Arr=new int[]{1,2,3};
Arr[0]=11;
Arr[1]=22;
Arr[2]=33;
for(int i=0;i<Arr.length-1;i++){
System.out.println(Arr[i]);
}
}
}
***程序开始运行时
1、首先将程序编译成ArrMemory.class文件并加载到方法区
2、将main()方法加载到栈内存,开始运行第一行代码i=5,将在栈内存中开辟一个a变量的区域将5存储到里边,然后在开辟一个空间用来存放数组变量Arr,随即系统将会在堆内存中开辟一段的数组空间用来存放数组元素,并将产生的地址赋值给数组变量Arr。
3、然后就可以通过数组变量Arr来访问堆内存中的数组元素。
六、两个数组变量指向同一个数组对象
public class demo06 {
public static void main(String[] args) {
//两个数组变量指向同一个数组对象
int []ArrIntDemo1={1,2,3};
int []ArrIntDemo2=ArrIntDemo1;
ArrIntDemo2[0]=11;
ArrIntDemo2[1]=22;
ArrIntDemo2[2]=33;
//输出两个数组的地址
System.out.println(ArrIntDemo1);
System.out.println(ArrIntDemo2);
//输出元素值
System.out.println(ArrIntDemo1[1]);
System.out.println(ArrIntDemo2[1]);
//数组使用的常见问题
//1、如果访问元素位置超过最大索引,执行时会出现ArrayIndexOutOfBoundsException(数组索引越界异常)
int []arr=new int[]{1,2,3};
System.out.println(arr[2]);
//System.out.println(arr[3]);//出现异常
//2、如果数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现NullPointerException(空指针异常)
int []ary=new int[3];
ary=null;
System.out.println(ary);
//System.out.println(arr.length);//出现异常
}
}
以上代码会发现数据类型相同的数组之间可以直接赋值,且赋值之后的数组变量和原数组变量具有相同的地址空间,可通过新的数组变量直接操作数组中的数据元素。