前面二白讲了选择结构和循环结构,动手的同学会发现已经有了一定的难度,后面二白会专门收集一些经典的题目,训练多了才能让记忆更加深刻,这次咱们讲一下数组。
一、数组的定义
什么是数组呢,我们都知道变量是存储数据的空间(装数据的容器),变量中只能存储一个数据,数组也是存储数据的空间(装数据的容器),但是与变量不同的是在数组中可以存储多个数据,但是多个数据的类型要相同。
二、语法(格式)
第一步:声明数组:准备一个可以存储多个数据的容器
数据类型[] 数组名; 或者 数据类型 数组名[];
第二步:分配空间:告诉数组中可以存储多少个数据
数组名 = new 数据类型[数据的个数];
第三步:赋值:将数据存储到数组中指定下标的位置
数组名[下标] = 数据;
注意:如果你没有给数组指定下标赋值,系统默认给数组元素赋值,整型(byte、short、int、long)默认值为0,浮点数(float、double)默认值为0.0,char类型数组元素默认值' ',boolean类型数组元素默认值为false,引用数据类型数组元素默认值为null。
第四步:操作数组中的元素
数组名[下标]
注意:数组的长度一旦声明好了之后就固定不变,不能修改,数组元素下标的范围是0~数组长度-1,下标值不能超出这个范围,超出这个范围会报ArrayIndexOutOfBoundsException(数组下标越界异常)
总结:
完整格式:
数据类型 [] 数组名 = new 数据类型 []{元素1,元素2……};
简化格式:
数据类型 [] 数组名 = {元素1,元素2……};
扩展:地址值
如下:
double [] arr1 = {1.1,2.1};
System.out.println("arr1 = " + arr1);
解释一下地址值的格式含义 :[D@6d311334
[ 表示当前是一个数组
D:表示当前数组里面的元素都是double类型的
@:表示一个间隔符号(固定格式)
6d311334:才是真正的地址值(十六进制)
平时我们习惯性的会把这个整体叫做数组的地址值
三、输出数组内容
简单写法
1.定义数组
int [] arr = {1,2,3,4,5};
2.获取数组里面所有的元素
格式:数组名[索引]
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println(arr[4]);
利用循环改进代码
开始条件:0
结束条件:数组的长度-1(最大索引)
for (int i =1;i<5;i++){
System.out.println( arr[i]);
}
注意:在Java中,关于数组的一个长度属性,length
调用方式:数组名.length
System.out.println(arr.length);
for (int i =1;i<arr.length;i++){
System.out.println( arr[i]);
}
扩展:
自动的快速生成数组的遍历方式
idea提供的
数组名.fori
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
四、简单练习
定义一个数组,用来存储班级中50个学生的姓名,姓名未知,等学生报道之后,再进行添加
String[] arr = new String[50];
// 添加学生
arr[0] = "张三";
arr[1] = "李四";
// 获取
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);//打印出来的是默认初始化值null
// 数组默认初始化值的规律
// 整数类型:默认初始化值0
// 小数类型:默认初始化值0.0
// 字符类型:默认初始化值'\u0000'——空格
// 布尔类型:默认初始化值false
// 引用数据类型:默认初始化值null
int[] arr2 = new int[3];
System.out.println(arr2[0]);//0
System.out.println(arr2[1]);//0
System.out.println(arr2[2]);//0
五、略微复杂练习
有一组学员的成绩{99,85,82,63,60},将它们按降序排列。要增加一个学员的成绩,将它插入成绩序列,并保持降序
思路:
向一个已经排序好的数组中插入一个数据的思想:
1)新建一个长度比原来数组长度大1的新数组
2)将原来数组中的元素按照对应下标的关系存储到新的数组中
3)获取你要插入的值,通过Scanner对象来实现
4)获取插入元素要插入的位置(下标):通过循环的方式,将你要插入的元素与数组的元素值比较,一旦插入值比数组的某个值大,这个值的位置就是要插入的位置,后续就不需要再比较了
5)移动元素:从插入位置开始的元素以及之后的元素依次往后移动一位,注意:从倒数第二个元素开始往后移动
6)将要插入的元素赋值到插入位置处
package cn.kgc.se;
import java.util.Scanner;
/**
* @JdkVersion: 17
* @Author: 二白程序员
* @Date 2024/4/8 14:20
* QQ:1512015112
* VX:18056394367
*/
public class Demo10 {
public static void main(String[] args) {
/*
* 有一组学员的成绩{99,85,82,63,60},将它们按降序排列。要增加一个学员的成绩,将它插入成绩序列,并保持降序
* */
Scanner scanner = new Scanner(System.in);
int[] scores = {99,85,82,63,60};
//1):新建一个长度比原来数组长度大1的新数组
int[] newScores = new int[scores.length+1];
//2)将原来数组中的元素按照对应下标的关系存储到新的数组中
// newScores[0]=scores[0];
// newScores[1]=scores[1];
// newScores[2]=scores[2];
// newScores[3]=scores[3];
// newScores[4]=scores[4];
//上述操作可以通过循环的方式来实现
for(int i =0;i< scores.length;i++){
newScores[i]=scores[i];
}
//新数组元素:99 85 82 63 60 0
//遍历输出新数组中的所有元素
for(int a :newScores){
System.out.print(a+" ");
}
System.out.println();
//3)获取你要插入的值,通过Scanner对象来实现
System.out.println("请输入你要插入的值:");
int insertNum = scanner.nextInt();
//4)获取插入元素要插入的位置(下标)
//假设插入元素要插入的位置是数组最后一个位置(数组最后一个元素是默认值,不是我们赋予的值),下标为newScores.length-1
int index = newScores.length-1;
for(int i =0;i<newScores.length;i++){
//比较要入的元素与数组中的元素
if(insertNum>newScores[i]){
index=i;
break;//一旦得到插入元素比数组某个元素大,就结束循环后续所有操作,不再比较
}
}
System.out.println("插入元素要插入的位置:"+index);
// 5)移动元素:从插入位置开始的元素以及之后的元素依次往后移动一位,注意:从倒数第二个元素开始往后移动
//99,85,82,63,60
for(int i =newScores.length-1;i>index;i--){
newScores[i]=newScores[i-1];
}
System.out.println("------------------------");
//6)将要插入的元素赋值到插入位置处
newScores[index]=insertNum;
//遍历输出新数组中的所有元素
for(int a :newScores){
System.out.print(a+" ");
}
System.out.println();
}
}