数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作。
1.基本概念
1.1 动态初始化
数组是引用数据类型,有内存分配问题。
数组动态初始化:声明并开辟数组
数据类型[ ] 数组名称 = new 数据类型 [长度]
特点:数组首先开辟内存空间,再通过使用索引来进行内容的设置。
eg:
public class ArrayDemo{
public static void main (String [ ] args){
int [ ] x = new int [3];
System.out.println(x.length);
x [0] = 1;
x [1] = 2;
x [2] = 3;
for (int i = 0;i < x.lengrh; i++ ){
System.out.println (x [i]);
}
}
}
数组开辟空间后,就可以采用如下方式进行操作:
① 数组的访问通过索引完成。即“数组名称[索引]”
小tip: 数组索引从0 开始,可以采用的索引范围为(0~ 索引-1);
例如:现在开辟了三个空间的数组,那么索引就是:0、1、2.
如果访问超过索引访问,那么会产生“javalang.ArrayIndexOutOfBoundsException”
异常信息。即数组越界是报错(运行时异常)
② 当数组采用动态开辟空间后,数组之中的每个元素都是该数据类型的默认值。
③ 数组本身是一个有序的集合操作,所以对于数组的内容往往采用循环的模式完成(数组是一个有限的集合,采用for循环)。
④ 在Java中有一种动态取得数组长度的方法:数组名称.length;
数组本身除了声明并开辟空间外,还有另外一种开辟模式。
即 分布进行数组实例化:
eg:
int [] x = null;
x = new int [3];
数组属于引用数据类型,因此在使用之前一定要开辟空间(实例化),否则就会产生"NullPoninterException".
1.2 引用传递
数组作为引用数据类型,一定也可以发生引用传递。
引用传递空间:同一块堆内存可以被不同的栈内存指向。
eg:
多个栈内存指向堆内存:
public class ArrayDemo{
public static void main(String[] args){
int [] x = null;
int temp = null ;
x = new int [3];//在堆上分配了内存空间
System.out.println(x.length);
x[0] = 1;//数组第一个元素
x[1] = 2;//数组第二个元素
x[2] = 3;//数组第三个元素
for (int i = 0;i < x.length;i++){
System.out.println(x[i]);//通过循环控制索引下标更改;
}
temo = x;//发生引用传递时不出现[]
temp [0] =55;// 修改数据
System.out.println(x[0]);
}
}
1.3数组静态初始化
特点:数组在定义的同时设定内容。
简化格式:
数据类型[] 数组名称 = {值,值,......}
完整格式:
数据类型[] 数组名称 = new 数据类型[]{值,值, .....}
eg:
public class ArrayDemo{
public static void main (String[] args){
int[] x = {1,2,3,4,5,6,7,8,9};//静态初始化数组
System.out.println(x.length);
for (int i = 0;i < x.length;i++){
System.out.println(x[i]);
}
}
}
这里引入一个概念:匿名数组
匿名数组是指:没有任何栈内存指向的数组
匿名数组只能使用一次,并且只能使用完整格式。
eg:
public slass ArrayDemo {
publi static void mian(String[] args){
System.out.println(new int [] {1,2,3,4,5,6,7,8,9}.length);
}
}
建议在使用静态方法定义数组的时候使用完整格式。
数组的最大缺陷:长度固定:一旦声明后,长度不可改变。(存在越界问题)