1、什么是数组:
数组是一个变量,存储是相同数据类型的一组数据,声明数组,就是在内存中划分一串连续的空间
注意:
数组一经定义,大小就确定了,不可以在此基础上再增加空间(重新创建除外),即:不可以动态扩展空间
2、数组的基本要素:
数据类型:指定数组中存放的数据类型
标识符:数组名称
数组元素:存放在数组中的数据
下标:从0开始,最大不能大于数组的长度-1
注意:
数组长度固定,应避免地址下标越界获取元素
3、如何定义和使用数组
1)声明数组
方式1:数据类型[] 数组名; -- 推荐写法
方式2:数据类型 数组名[];
2)分配空间 使用 new 关键字
数组名 = new 数据类型[数组长度];
注意:
长度必须要定义,代表数组可以存放的元素个数
备注:
数组元素,根据不同的数据类型,会有不同的初始值(数组定义后,不初始化赋值,仍然可以直接访问元素,不会报错,比如:int--0,String--null...)
3)赋值
实际是向分配的内存空间存放数据(实际是地址的引用)
语法:
数组名[下标] = 定义数据类型的值;
声明数组同时赋值:
方式1:
数据类型[] 数组名 = {元素1,元素2....};
方式2:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2....};
注意:
由于初始化值,已经确定了数组的元素个数,所以,不可以再指定长度
边声明边赋值:必须定义在一条语句内,不能分开
比如:
int[] scores = new int[5];
scores = {1,2,3,4,5};
4)数组的使用
数组元素赋值之后,可以重复获取,并使用
4、数组长度
语法:数组名.length
注意:数组长度,使用的length数组,有别于字符串,字符串长度使用的是length()方法
示例:
for(int i = 0; i < scores.length; i++){
System.out.println(scores[i]);
}
5、数组求最大值和最小值
原理:
类似打擂台,借助中间表变量,依次比较,保留最大或者最小值
6、向数组中插入元素
已经确定了顺序数组:
// 定义已排序数组,插入一个数值,保证排序不变
int[] nums = {99, 88, 77, 66, 44, 33, 22, 11};
// 扩容,定义一个新的数组,在原数组长度基础上,加1,用于存放新插入的数值
int[] newNums = new int[nums.length + 1];
System.out.println("------------原数组-----------");
System.out.println(Arrays.toString(nums));
// 拷贝原数组的元素,存入新数组,并保证顺序
for (int i = 0; i < nums.length; i++) {
newNums[i] = nums[i];
}
System.out.println("------------新数组-----------");
System.out.println(Arrays.toString(newNums));
// 系统输入对象
Scanner input = new Scanner(System.in);
// 提示信息
System.out.print("请输入要插入的数值:");
int num = input.nextInt();
// 定义变量,用于保存要插入的位置下标
int index = -1;
// 遍历新数组,确定要插入数值的下标(原始是降序,只需要找到比谁大,这个位置就是插入位置)
for (int i = 0; i < newNums.length; i++) {
// 判断要插入的数值比哪个数大
if(num > newNums[i]){
// 找到了插入的位置
index = i;
// 立刻结束,后面的数都比当前数小,否则一致比较到最后,插入错误
break;
}
}
// 移动数组元素,从最后开始移动,依次将前面的数值赋值给后面的数值,将插入的位置空出来
for (int i = newNums.length - 1; i > index; i--) {
newNums[i] = newNums[i - 1];
}
System.out.println("------------移动后-----------");
System.out.println(Arrays.toString(newNums));
// 将要插入的数值,存入要插入的下标位置,即可
newNums[index] = num;
System.out.println("------------插入后-----------");
System.out.println(Arrays.toString(newNums));
// 强调:数组用于保存一组相同数据类型的数值,遍历和随机访问元素效率比较高,但是不适用于插入元素(需要移动元素位置),效率低
input.close();
无序数组元素,使用工具类排序示例:
// 已排序数组中插入元素
int[] scores_old = {88, 66, 55, 99, 22, 33, 77, 11};
// 要插入一个新的数值,必须要讲原始数组进行扩容(原始数组长度+1)
int[] scores_new = new int[scores_old.length + 1];
// 数组排序和数组内容输出,借助Arrays工具类
System.out.println("--------------排序前:--------------");
System.out.println(Arrays.toString(scores_old));
// 排序,默认是升序, 只要调用了该方法,数组中的元素顺序就改变了
Arrays.sort(scores_old);
System.out.println("--------------排序后:--------------");
System.out.println(Arrays.toString(scores_old));
// 拷贝数组-降序排列
// 使用循环,从后往前输出到新数组
for (int i = scores_old.length - 1, j = 0; i >= 0; i--, j++) {
scores_new[j] = scores_old[i];
}
System.out.println("--------------降序后:--------------");
System.out.println(Arrays.toString(scores_new));
// 确定要插入的数值
Scanner input = new Scanner(System.in);
System.out.print("输入要插入的成绩:");
int score = input.nextInt();
// 定义要插入的位置
int index = -1;
// 遍历数组,找到要插入的位置下标:找到比谁大,这个位置就是要插入的位置
for (int i = 0; i < scores_new.length; i++) {
if(score > scores_new[i]){
index = i;
// 要立刻结束,否则,index就是最后一个
break;
}
}
// 移动数组内容,从数组的最后一个元素开始,一直到要插入的位置元素结束
for (int i = scores_new.length - 1; i > index; i--) {
scores_new[i] = scores_new[i - 1];
}
// 输出移位后数组内容
System.out.println("--------------移位后:--------------");
System.out.println(Arrays.toString(scores_new));
// 将插入的数值,根据定位的下标,重新赋值
scores_new[index] = score;
System.out.println("--------------插入后:--------------");
System.out.println(Arrays.toString(scores_new));
input.close();