一.数组
技能目标:
1.掌握数组的定义
2.数组的内存分配
3.掌握数组的遍历
4.掌握Arrays类的常用用法
5.了解二维数组的使用
1.一维数组
需求:
存储50个学生某门课的成绩,并求其平均值
分析:
//定义50个变量,分别存放这50个学生的成绩
int scorce1 =95;
int scorce2 =92;
int scorce3 =93;
int scorce4 =94;
…
int scorce50 =90;
avg =(scorce1+…+scorce50)/50
解析:
变量定义太多
2.定义数组
定义数组时一定要指定数组的名称和数组的类型
必须的书写方式“[]”,表示的就是定义一个数组,而不是一个普通的变量
"[数组长度]"决定了连续分配的空间长度,通过数组length属性可以获取数组长度
数组的数据类型用于确定分配每个空间的大小
例1:
使用两种语句分别定义整数型数组和字符串数组
数组元素分配的初始值
数组元素的类型 | 默认初始值 |
---|---|
byte、short、int、long | 0 |
float、double | 0.0 |
char | ”\u0000“ |
boolean | false |
引用数据类型 | null |
package Test;
/**
* @作者:Xem626
* @date: 2022/7/3 22:02
* @TODO
*/
public class Test1 {
public static void main(String[] args) {
int [] score=new int[10];
String citys[]=new String[6];
}
}
解析:
数组score分配了5个连续的空间,每个空间都存储了我们整数型数据,每个空间的值是0;
数组citys分配了6个连续的空间,每个空间存储的是字符串
类型数据,每个空间的默认值是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,…}
package Test;
/**
* @作者:Xem626
* @date: 2022/7/3 22:23
* @TODO
*/
public class Test2 {
public static void main(String[] args) {
int scroce[]={75,78,79};
int scrice1[]=new int[]{75,78,79};
}
}
5.遍历数组
数组和循环往往结合在一起使用,通常使用for循环
例2:
创建整型数组,从控制台接收键盘输入的整型数据,并对数组进行循环赋值
实现的步骤:
1.创建整型数组
2.创建一个Scanner对象
3.将循环变量i作为数组下标,循环接收键盘输入,并为数组元素赋值
package Test1;
import java.util.Scanner;
/**
* @作者:Xem626
* @date: 2022/7/4 12:52
* @TODO
*/
public class Test2 {
public static void main(String[] args) {
int []a=new int[10];
Scanner scanner=new Scanner(System.in);
for(int i=0;i<a.length;i++){
a[i]=scanner.nextInt();
}
for(int j=0;j<a.length;j++){
System.out.print(a[j]+"\t");
}
}
}
例3:
需求:
创建整型数组,循环输出数组元素
实现步骤:
1.初始化整型数组
2.以循环变量i为数组下标,循环输出数组元素
package Test1;
/**
* @作者:Xem626
* @date: 2022/7/4 13:00
* @TODO
*/
public class Test3 {
public static void main(String[] args) {
int a[]={1,2,3,4,5,6,7,8};
for(int i=0;i<a.length;i++){
System.out.print(a[i]+"\t");
}
}
}
dk1.5:之后为我们提供了一个增强for循环,用来实现对数组和集合中的访问,增强for循环的语法格式:
for(元素类型 变量名:要循环的数组或集合){
......
}
括号中的第一个元素类型指的是数组或集合中元素类型,变量名在循环时保存每个元素的值,冒号后面是我们要循环的数组或集合的名称
例4:
创建整型数组,利用增强for循环来输出数组的元素
实现的步骤:
1.初始化整型数组
2.用增强for循环
package Test1;
/**
* @作者:Xem626
* @date: 2022/7/4 13:06
* @TODO
*/
public class Test4 {
public static void main(String[] args) {
int a[]={23,23,11,24,33};
for(int i:a){
System.out.println("数组元素值依次为:"+i);
}
}
}
6.使用数组来计算成绩
例5:
使用数组计算5名学生的平均分和最高分、最低分
实现的步骤:
1.定义长度为5的整型数组
2.定义两个float类型的变量,用于保存总成绩、平均分、初始值为0
3.定义两个int类型的变量,用于保存最高分和最低分,初始值为0;
4.从控制台上接收5名学生的成绩
5.通过循环使数组的5个元素相加得到总成绩
6.通过循环遍历数组并比较元素的大小,得到最高分和最低分
package Test1;
import java.util.Scanner;
/**
* @作者:Xem626
* @date: 2022/7/4 13:10
* @TODO
*/
public class Test5 {
public static void main(String[] args) {
int a[]=new int[5];
float score=0f;
float avg=0f;
int max=0;
int min=0;
Scanner scanner=new Scanner(System.in);
System.out.println("请输入5名学生成绩");
for(int i=0;i<a.length;i++){
a[i]=scanner.nextInt();
score+=a[i];
}
System.out.println("总分为:"+score);
max=a[0];
min=a[0];
for(int j=0;j<a.length;j++){
if(a[j]>max){
max=a[j];
}
if(a[j]<min){
min=a[j];
}
}
System.out.println("最大值"+max);
System.out.println("最小值"+min);
}
}
7.数组的添加
例6:
当已经存在一个数组”a“时,如何向数组”null”位置插入数呢?
分析:
index变量相当于一个监听器。赋初始值为“-1”,就是为了和数组下标:0,1,2…区分开。
遍历数组中的元素,如果发现null就会把i赋值给index,相当于找到了null的下标,此时使用break跳出循环
随后进入下一个if语句,首先判断index值是否变化,如果变化了(不等于-1),说明发现null的元素
“a[index]=“p5””.因为index在上个if语句中已经充性赋值为null的下标,这时直接找到那个空位置,赋值“p5”
package Test1;
/**
* @作者:Xem626
* @date: 2022/7/5 21:44
* @TODO
*/
public class Test6 {
public static void main(String[] args) {
int index=-1;
String a[]=new String[]{"p1","p2","p3","p4",null};
for(int i=0;i<a.length;i++){
if(a[i]==null){
index=i;
break;
}
}
if(index!=-1) {
a[index] = "p5";
for (int j = 0; j < a.length; j++) {
System.out.print(a[j] + "\t");
}
}else{
System.out.println("数组里满员,没有null");
}
}
}
8.数组的修改
例8:
需求:
当已经存在一个数组“a”,如何修改p5的值?
package Test1;
/**
* @作者:Xem626
* @date: 2022/7/6 9:46
* @TODO
*/
public class Test7 {
public static void main(String[] args) {
int index=-1;
String a[]=new String[]{"p1","p2","p3","p4","p5"};
for(int i=0;i<a.length;i++){
if(a[i].equals("p5")){
index=i;
break;
}
}
if(index!=-1){
a[index]="p10";
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
}else{
System.out.println("不存在p5");
}
}
}
9.数组的删除
需求:
当已经存在一个数组“a”时,如何删除“p3”的值呢
思路:
首先找到要删除的位置,删除后把后面的数据依次前移,将最后以一位设置null
package Test1;
/**
* @作者:Xem626
* @date: 2022/7/6 9:57
* @TODO
*/
public class Test8 {
public static void main(String[] args) {
int index = -1;
String a[] = new String[]{"p1", "p2", "p3", "p4", "p5"};
for (int i = 0; i < a.length; i++) {
if (a[i].equals("p1")) {
index = i;
break;
}
}
if(index!=-1){
for(int j=index;j<a.length-1;j++){
a[index]=a[index+1];
}
a[a.length-1]=null;
}else{
System.out.println("没有要删除的元素");
}
for(int x=0;x<a.length;x++){
System.out.println(a[x]);
}
}
}
常见问题
数组的下标从0开始。而不是从1开始,如果访问数组元素时指定下标小于0,或者大于数组的长度,都会出现这个数组下标越界这个异常