数组的概念
数组是存放同一种类型的数据的集合,它在内存里占一段连续的空间。
例如:int数组 ,就是数组里的数据都是int类型的; float数组,就是数组里都是float类型的 ;
(猪圈里只养猪,不养别的东西;羊圈里只养羊,不养别的东西)
数组的定义
数据类型[ ] 数组名 ;(数据类型后跟一个中括号+空格+数组名),就可以定义一个数组的引用;
(这时候这三个数组的引用不指向任何数据,连null都不是)
怎么定义并初始化一个数组,可以用下面几个方式;
在定义的时候直接赋值
格式 :类型[ ] 数组名 = { 数据1,数据2..... };
(用大括号圈住数据,里面的各个数据用逗号隔开)
第一个数组 array1 里就有了三个元素 (1 和 2 还有 3);
这样的直接赋值只能在数组定义的时候使用,不然的话就不能这样赋值;
例如:
(这里在定义了数组arr后直接赋值,这里编译器会报错,所有直接赋值只能在数组定义时使用)
用关键字new创建数组
格式:类型[ ] 数组名 = new 类型 [ 数组大小 ] ;
(把一个大小10 的数组 赋给 array1,这里的10 就是这个数组最多可以存放10个int类型的数据)
通过new 关键字创建的数组,数组里的元素都是各个数据类型的默认值
例如:
(输出这个数组里的第一个元素,输出结果是0 )
各类数组元素的默认值
用关键字new给数组赋值
我们前面说了,给数组直接赋值只有在定义数组的时候可以用,但是如果我不想在定义数组的时候直接赋值,我想在定义完数组后赋值,那可以这样做 ;
(可以看到数组array2会报错,但是后面的array3没有报错)
可以这样的方法给数组赋值了;
同一个类型的数组之间可以互相赋值
两个相同类型的数组之间,可以互相赋值 ;
数组array1和array2 都是int类型的数组 ,把array1的值赋给array2,就相当于令array2这个数组引用指向 array1 指向的数组 ;(array3和array4同理)
(array1和array2指向 同一个 数组)
获取数组的元素
下标 :
把数组看成是一个长方形 ,这个长方形分成多份,每一份就是一个元素 ,下标就是这些元素的对应的序号 。下标从0 开始 ;
(如图:array里 ,下标0对应的元素就是1)
通过下标获取数组的元素 ;
格式 : 数组名 [ n ] ; (数组名后跟一个中括号,中括号里是下标)
如图:
ret1 里拿到的就是数组里下标为0 的元素 ; ret2 里拿到的就是数组里下标为1 的元素 ;
ret3 里拿到的就是数组里下标为2 的元素 ; ret4 里拿到的就是数组里下标为3 的元素 ;
int[] array = {1, 2, 3, 4 } ;
int ret1 = array[0] ;
int ret2 = array[1] ;
int ret3 = array[2] ;
int ret4 = array[3] ;
System.out.println("ret1 = " + ret1 );
System.out.println("ret2 = " + ret2 );
System.out.println("ret3 = " + ret3 );
System.out.println("ret4 = " + ret4 );
我们输出一下ret1,ret2 , ret3 , ret4 的值 ;
数组的越界访问
我们知道了 array 数组的下标范围 就是 0 ~ 3 , 如果我们使用的下标不在这个范围里面 就会出现数组下标越界异常;
(通过下标4访问数组,但是数组没有下标4,这就是下标越界了)
因为我们超出了array数组下标的范围了,所以运行代码时编译器抛异常了 ;
(访问数组时,要注意下标有没有超出范围)
获取数组的长度
我们可以通过获取数组的长度来访问数组,从而减少数组越界的错误 ;
格式 : 数组名 . length ; (数组名后跟一个 点 length)
此时 len1 = 3 , len2 = 3 ; len1 拿到了array1 的长度 ,len2 拿到了array2 的长度 ;
有了数组的长度就可以借助数组长度输出数组的元素:
通过foreach循环获取数组元素
格式 : for( 类型 变量名 : 数组 ){ }
用一个变量来获取数组里的元素(这个变量的类型和数组里元素的类型一致);
int[] array = { 2, 3, 4, 5} ;
for(int i : array){
System.out.print(i + " ");
}
(代码输出 : 2 3 4 5)
在foreach循环里 ,循环开始时 ,i 就得到了array数组的第一个元素,每次循环得到数组的下一个元素,循环直到把这个数组的元素都遍历了结束 ;
foreach循环没有拿到数组的下标,它只是获取了元素的值,不能像其他循环那样通过下标做出一些操作;