技能目标:
1.掌握数组的定义
2.数组的内存分配
3.掌握数组的遍历
4.掌握Arrays类的常用用法
5.了解二维数组的使用
1.一维数组
1.理解数组
需求:
存储50个学生某门课的成绩,并求其平均值
如果是之前需要给每个学生定义一个变量
如:
int scorce1 =95;
int scorce2 =92;
int scorce3 =93;
int scorce4 =94;
.....
int scorce50 =90;
avg =(scorce1+....+scorce50)/50
如果用数组就会简单很多
先来看看数组定义
定义数组时一定要指定数组的名称和数组的类型
必须的抒写方式“[]”,表示的就是定义一个数组,而不是一个普通的变量
"[数组长度]"决定了连续分配的空间长度,通过数组length属性可以获取数组长度
数组的数据类型用于确定分配每个空间的大小(new)
int scorce[]=new int
int scorce[]=new int[50];
这样就定义了一个整形数组scorce可以存放50了数据
数组元素分配的初始值为0
数组元素的类型 | 默认初始值 |
---|---|
byte、short、int、long | 0 |
float、double | 0.0 |
char | ”\u0000“ |
boolean | false |
引用数据类型 | null |
每种类型的初始值不同
3.数组元素的表示与赋值
由于定义数组时内存分配的是连续的空间,所以数组元素在数组里面顺序排列编号,该编号即元素下标,它标明了元素在数组中的位置。首元素的编号规定为0,因此,数组下标依次为0、1、2、3、4....依次增加,每次的增长数是1.数组中的每个元素都可以通过下标来访问。例如,数组scores的第一个元素表示为scores[0].
如:
scorce[0] =65 //表示scorce数组的第一个元素赋值给他为65
scorce[1]=87 //表示scorce数组的第二个元素赋值给他为85
4.数组的初始化
所谓的数组初始化,就是在定义数组时一并完成赋值操作
数组的初始化的语法格式:
数据类型[] 数组名={值1,值2,....值n}
或者:
数据类型[] 数组名 =new 数据类型[]{值1,值2,值3,....}
5.遍历数组
数组和循环往往结合在一起使用,通常使用for循环
示例:
需求:
创建整型数组,循环输出数组元素
实现步骤:
1.初始化整型数组
2.以循环变量i为数组下标,循环输出数组元素
jdk1.5之后为我们提供了一个增强for循环,用来实现对数组和集合中的访问,增强for循环的语法格式:
for(元素类型 变量名:要循环的数组或集合){
......
}
括号中的第一个元素类型指的时数组或集合中元素类型,变量名在循环时保存每个元素的值,冒号后面是我们要循环的数组或集合的名称
i 即是对应每个数组值
示例:使用数组计算成绩
使用数组计算5名学生的平均分和最高分、最低分
实现的步骤:
1.定义长度为5的整型数组
2.定义两个float类型的变量,用于保存总成绩、平均分、初始值为0
3.定义两个int类型的变量,用于保存最高分和最低分,初始值为0;
4.从控制台上接收5名学生的成绩
5.通过循环使数组的5个元素相加得到总成绩
6.通过循环遍历数组并比较元素的大小,得到最高分和最低分
示例:数组的添加
当已经存在一个数组”arr“时,如何向数组”null”位置插入数呢?
分析:
index变量相当于一个监听器。赋初始值为“-1”,就是为了和数组下标:0,1,2...区分开。
遍历数组中的元素,如果发现null就会把i赋值给index,相当于找到了null的下标,此时使用break跳出循环
随后进入下一个if语句,首先判断index值是否变化,如果变化了(不等于-1),说明发现null的元素
“arr[index]="f"”.因为index在上个if语句中已经充性赋值为null的下标,这时直接找到那个空位置 f ”
示例:数组的修改
需求:
当已经存在一个数组“arr”,如何修改 f 的值?
与添加类似用index找到需要
示例:数组删除
需求:
当已经存在一个数组“arr”时,如何删除“b”的值呢
思路:
首先找到要删除的位置,把后面的数据依次前移,将最后以一位设置null
常见问题
注意:
数组的下标从0开始。而不是从1开始,如果访问数组元素时指定下标小于0,或者大于数组的长度,都会出现这个数组下标越界这个异常
4.二维数组
java中定义和操作多维数组的语法与一维数组类似。在实际开发中,使用的很少.
定义二维数组的语法格式:
数据类型[][] 数组名
或者
数据类型 数组名[][]
1.数组类型是数组元素的类型
2.[][] 用于定义了一个二维数组,通过·多个下标进行数据访问
示例:
定义一个整型的二维数组,并为其分配的内存空间
int[][] s =new int[3][5];
表面上看是二维数组,但是从内存分配来看,实际上就是一个一维数组,数组名为s,包括了3个元素,分别是s[0]、s[1]、s[2],每个元素是整型数组类型,即一维数组类型。而s[0]又是一个数组的名称,包括了5个元素
分别是s[0][0]、s[0][1]、s[0][2]、s[0][3]、s[0][4]、每个元素都是整数类型。s[1]、s[2]、s[3]情况相同
所以二维数组实际上就是一个一维数组,每个元素又是一个一维数组。
s[1][0]、s[1][1]、s[1][2]、s[1][3]、s[1][4]
注意:
从语法上看Java支持多维数组,但是从内存分配原理上来看,其实就是一维数组,java中只有一维数组,没有多维数组。
二维数组得使用
二维数组也可以进行初始化操作,与一位数组类似,同样可以采用两种方式
格式
示例:
int arr[][];
int arr=new [3][5];
或者
int arr[][]=new int[3][5];
1.初始化二维数组
示例:int arr[][]=new int[][]{ {1,2,3,4,5},{2,3,5},{9} };
或者
int arr[][]={ {1,2,3,4,5},{2,3,5},{9} };
2.二维数组的遍历:
示例15:
分别计算每个班级的总成绩
实现的步骤:
1.初始化一个整数型的二维数组
2.定义和保存总成绩的变量
3.使用for循环遍历二维数组
Arrays类
JDK中提供了一个专门用于操作数组的攻击类,即Array类,位于java.util包中,该类提供了一系列方法来操作数组,比如排序、复制、比较、填充等、用户直接调用这些方法即可,不需要自己编码去实现,降低开发难度。
方法 | 返回值 | 说明 |
---|---|---|
equals(array1,array2) | boolean | 比较两个数组是否相等 |
sort(array) | void | 对数组arry元素的进行升序的排列 |
toString(arrry) | string | 将一个数组arry转换一个字符串 |
fill(arry,val) | void | 把array数组中所有的元素都赋值为val |
copyOf(arry,length) | 与arry数据类型一致 | 把数组arry复制成一个长度为length的新数组 |
binarySearch(array,val) | int | 查询元素值val在数组arry中的下标 |
1.比较两个数组是否相等
Arrays类的equals()方法·用于标胶两个数组是否相等,只有当两个数组长度相等,对应的位置的元素也就一一相等时,该方法就返回true否则返回false
示例16
需求:
初始化3个整数的一维数组,使用Arrays类的equals()方法判断是否两两相等,并输出结果
2.对数组的元素进行升序排列
Arrays类的sort()方法对数组的元素进行升序排列,也就是从小到大的顺序排列
示例17:
需求:
分别对1班,2班,3班的学员成绩进行排序
实现步骤:
1.初始化一个整型的二维数组
2.使用for循环去遍历二维数组
3.使用Arrays类的sort()方法对二维数组的元素进行升序排列
4.输出验证排序
3.将数组转换成字符串
toString()将一个数组转换成一个字符串,它按照顺寻把多个数组元素连接一起,多个元素之间使用英文逗号和空格隔开
4.将数组所有的元素赋值为相同的值
Arrays类中提供了一个fill(arry,val),此方法用于把数组arry所有的元素都赋值为val
示例19:
public class Text {
public static void main(String[] args) {
int ban[]={99,91,54,99,100};
System.out.println(Arrays.toString(ban));
Arrays.fill(ban, 97);
System.out.println(Arrays.toString(ban));
}
}
结果:
[99, 91, 54, 99, 100]
[97, 97, 97, 97, 97]
5.将数组复制成一个长度为设定值的新数组
实现的步骤:
1.初始化一个长度为4的整型数组
2.使用copyOf()方法
public class Text1 {
public static void main(String[] args) {
int ban[]={99,91,54,99,100};
System.out.println(Arrays.toString(ban));
int ban2[]=Arrays.copyOf(ban,3);
System.out.println(Arrays.toString(ban2));
int ban1[]=Arrays.copyOf(ban,8);
System.out.println(Arrays.toString(ban1));
}
}
结果:
[99, 91, 54, 99, 100]
[99, 91, 54]
[99, 91, 54, 99, 100, 0, 0, 0]
注意:
Arrays类的copyOf(array,length)方法可以进行数组复制,把原数复制成一个新数组,其中length是新数组的长度。如果length小于原数组的长度,则新数组就是原数组的前面length个元素;如果length大于原来数组的长度,则新数组前面的元素的原数组的所有元素;后面元素是按数组类型补充默认的初始值,如整型补充0,浮点型补充0.0等。
6.查询元素在数组中的下标
示例21:
本章总结:
1.数组可以在内存中连续存储多个元素的结构,数组中的所有元素必须属于相同的数据类型
2.数组中的元素通过数组下标进行访问,数组下标从0开始
3.二维数组实际上是一个一维数组,它的每个元素是一个一维数组
4.使用Arrays类提供的方法可以方便的对数组中的元素进行排序,查询等操作。
5.JDK1.5之后提供了增强for循环,可以用来实现对数组和集合中数据的访问