数组Array:相同类型数据的集合就叫做数组。数组长度(length),指的是数组元素的个数,元素的索引是从0开
始,最大索引==数组长度-1。
一、一维数组
1、一维数组定义:
a)单独声明
格式:
type[] 数组名;////声明,没有初始化
数组名 = new type[长度];//初始化
例如:
int[] a;
a = new int[5];
注意:单独声明的数组,在初始化前不可直接对元素操作。但是,初始化的数组可以赋值给一个未初始化的数组。
int a[];
a[0] = 1;//错误,数组没有初始化,不能赋值
下面的用法是可行的:
Object[] a;//引用型数组
Object[] b ={"abc","def"};
a = b;
int[] c;//原生型数组
int[] d ={1,2};
c = d;
b)定义数组同时给出长度,初始化为默认值(由元素数据类型决定):
格式:
type[] 变量名 = new type[数组长度]
//等价于:
type 变量名[] =new type[数组长度]
int[] a = new int[4];//定义一个长度为4的数组a[],各元素初始化为int型默认值0。
a[0] = 1;//给第一个元素赋值
a[1] = 3;
c)声明同时初始化为给定值
格式:type[] 变量名 = {枚举所有元素常量初始值,并用逗号分隔}
等价于
type[] 变量名 = new type[]{枚举所有元素初始值};//注意:type[]不能指明长度
//原生数据类型数组事例
int[] a = {1,2,3,4};//定义数组a[],a0-a3的值分别为1、2、3、4
int[] a = new int[]{1,2,3,4};//同上
//引用数据类型数组事例
class ArrayReference{
public static void main(String[] args){
I[] a = new I[]{new C(),newC()};
//上条语句等同于下列三行语句
//调用数组元素i[0]所指对象的方法prnVal()
i[0].prnVal();
}
interface I{//I接口定义
void prnVal();
}
static class C implements I{//接口I的执行C类
public void prnVal(){
System.out.println("接口多态");
}
}
}
注意:枚举数组常量只能用于数组定义,如下例是错误的。
int[] a;
a = {1,2,3,4};//仅能用于声明
2、array的length属性是public、final、int的,一旦确定,就不能改变它的大小。数组长度可以通过变量
名.length获得。
3、int[] a =newint[10],其中a是一个引用,它指向了生成的数组对象的首地址,数组中每个元素都是int类型,其中仅存放数据值本身。
4、若数组元素是引用类型,赋值前为null,赋值后指向引用地址。例如:
class ArrayTest{
public static void main(String[] args){
Person[] p = newPerson[3];
int[] pl = new int[3];
System.out.println(pl[0]);//打印为null
p[0] = newPerson(10);//数组元素指向新建引用对象,即存储对象的地址
p[1] = new Person(20);
p[2] = new Person(30);
for(int i=0;i<p.length;i++){
System.out.println(p[i].age);
}
}
}
class Person{
int age;
public Person(int age){
this.age = age;
}
}
二、二维数组
1、二维数组:是一种平面的二维结构,本质上是数组的数组。
2、二维数组定义:
a)单独声明,单独初始化
格式:
type[][] 数组名;
例如:
int[][] a;//声明,没有初始化
b)固定行列长度声明,初始为默认值(由数据类型决定)。
格式:
type[][] 数组名 = new type[一维长度][二维长度];
例:int[][] a = new int a[2][3];//定义一个2行3列的整型二维数组a,各元素值初始为0.
//注意:a[行号],是一个一维数组。比如上例中a[0]和a[1]都是一维数组
c)动态声明
动态声明首次声明时只声明一维的长度,二维的长度动态指定(一旦指定就不可改变)。
格式:
type[][] 数组名 = new type[一维长度][];
数组名[一维索引号] = new type[该行列长度];//可行原因,见b)里面的注意事项
例如:
int[][] a = new int[3][];
a[0] = new int[2];//初始一维索引号为1的数组,长度为2
a[1] = new int[3];
a[2] = new int[1];
注意:数组完全初始化后才能赋值,下例是错误的。
int[][] a = new int[2][];
a[0][1] = 1;//错误,第二维没有初始化
d)常量初始化声明
格式:
type[][] 变量名 = newtype[][]{{枚举行1所有元素的值},..,{枚举行n所有元素值}};//每行的元素个数不必相同。
或
type[][] 变量名 = {{枚举行1所有元素的值},..,{枚举行n所有元素值}};
例如:
//定义一个二维数组,并用指定值初始化
int[][] a = new int[][]{{1,2},{3,4},{5,6}};//各行长度相同
int[][] b = new int[][]{{1,2,3},{4},{5,6,7,8}};//各行长度不同
//打印出所有元素的值
for(int i =0;i<a.length;i++){//遍历数组的行
for(int j =0; j<a(i).length;j++){//遍历数组的列
System.out.println(a[i][j]);
{
}
注意:如果指定了初始化值,就不能指定长度。
int[] a = new int[2][1]{{1,2},{1}};//错误
e)常量动态始化声明
实际上就是上两种方法的综合使用,格式如下:
type[][] 变量名 = new type[一维长度值][];
变量名[一维索引] = new type[]{枚举该索引下所有数组元素的常量值};
例如:
int[][] a =new int[2][];
a[0] = new int[] {1,2,3};
注意:数组常量只能在初始化时使用。
int[][] a =new int[2][];
a[0] ={1,2,3,4};//错误,只能在初始化时使用
小结:
1、数组必须初始化方可使用;
2、二维数组的有二个索引,在Java中,每一行(由一维索引表示)又是一个数组,由此可以进行二次声明。
3、枚举数组常量只能使用在数组初始化时。在二维数组中,它不仅限于一次完整的声明也可使用在二次声明对其中一维数组的声明中。
4、默认化初始化,由数组的类型决定,原生数据类型由JVM默认,引用类型由引用初始时为null,赋值后指向对象。