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();