数组是最常见的数据结构,每个数组元素存放一个数据,通过数组元素的索引来访问数组元素。
一维数组
- 数组的定义
java支持两种方式来定义数组
1) type[] arrayName;
2) type arrayName[];
一般使用第一种,因为使用的语义更清晰具有更好的可读性。数组定义的是一种引用类型的变量,仅仅表示定义了一个引用变量(即一个指针)还未指向任何有效内存,因此还没有内存空间来存储数据元素,只有对数组进行初始化才可使用。
- 数组的初始化
数组需要进行初始化(即为元素分配内存空间,为每个数组元素赋初值)才可以进行使用
数组元素需要具有相同的数据类型,因此在一个数组中元素类型唯一。因为java是面向对象的语言,而类与类之间可以继承,因此会产生数组中存放多个数据类型的假象,但是其真相是它们的元素类型因为也是继承的所以还是同一类型的元素。数组初始化完成后,数组在内存中所占的空间将被固定,因此数组的长度不可变。即使将某个数组的元素清空它占据的空间依然被保存,依然属于该数组。
具有两种初始化方式
1)静态初始化:初始化时显式指定每个数组元素的初始值,由系统决定数组长度。
arrayName= new type[]{element1,element2,element3,……}
2)动态初始化:初始化时只指定数组长度,系统为数组元素分配初始值
arrayName = new type[length];
-
数组元素的初始值:
1)整数类型:byte,short,long,int为0
2)浮点类型:double,float为0.0
3)字符类型:char为’\u0000’
4)布尔类型:boolean为false
5)引用类型:类,接口,数组为null -
使用数组
对数组元素进行访问,进行赋值和取出。在数组引用变量后紧跟一个方括号[]里面的就是数组元素的索引值,凭借这个就可以对数组进行访问,数组元素可当作普通变量使用。索引值从0开始,最后一个元素为数组的长度-1 。数组的变量只是一个引用,因此这个引用量可以指向任何有效的内存。实际的数组对象被存储在堆内存中,引用量是一个局部变量被存储在栈内存中 -
遍历数组
for(int i=0;i<array.length;i++){
statement
}
- 数组的常见异常
1)数组索引越界异常(ArrayIndexOfBoundsException)
访问数组时访问到数组中的不存在索引编号
2)空指针异常(NullPointerException)
数组引用没有指向对象,代码却在操作数组对象中元素时
二维数组
- 数组的定义
定义上没有巨大的区别,因为二维数组相当于一维数组的扩展,从java底层语法看,数组变量是一个引用指向真实的数组内存,定义二维数组的实质其实就是定义一维数组,二维数组元素也是引用,指向一维数组的引用。定义方式有三种
1)type[][] arrayName;
2)type[] arrayName[];
3)type arrayName[][];
- 数组的初始化
和一维数组的区别在于多了行和列的概念。本质上相当于一维数组但是为了方便我们仍然将其视为行和列确定索引的数组。
方法一:new出对象再初始化每个对象
type[][] arrayName=new type[row][col];
//row为二维数组的长度,相当于行
//为二维数组中一维数组的长度,相当于列
arrayName[0][0] = XX;
arrayName[0][1] = XX;
arrayName[0][2] = XX;
……
方法二:new对象]初始化
type[][] arrayName=new typeName[][]{{X,X,X,X},{X,X,X,X},{X,X,X,X}};
方法三:赋值创建对象
type[][] arrayName={{X,X,X,X},{X,X,X,X},{X,X,X,X}};
初始化数组必须要指定其行数但是可以不指定列数。因此我们可以制定不规则数组
int[][] arr=new int[2][];
arr[0]=new int[2];
arr[1]=new int[4];
- 遍历数组
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[i].length;j++){
statement
}
}