数组


数组

1.概述

数组是相同数据类型的多个数据的容器

这些数组按照线性顺序排列。所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素;出最后一个元素外,每一个元素都有唯一的后继元素;(一个跟一个顺序排序

2.创建数组

2.1 常见格式

2.1.1 数据类型[]   数组名称   =   {  数据1 , 数据2...  };

创建数组的同时指定数组内容。

注意: 在{元素1,元素2....}里初始化值的形式只能在声明并赋值的创建数组格式中使用.

int[] ages = {10,11,12,13,14};

2.1.2 数据类型[]   数组名称   =   new  数据类型  [  数组长度(int类型)  ]

创建数组的同时指定数组长度。

int[] name = new int[5];

2.2 数组长度

如何获取数组的长度?数组名称 .length

int[] ages = {10,11,12,13,14};
System.out.println("数组的长度为:"+ages.length);

运行结果:image-20211002143305356

2.3 操作数组元素

2.3.1 获取数组元素

通过数组下标进行取值。

System.out.println("第一个元素是:"+ages[0]);

运行结果:image-20211002143705846

2.3.2 改变数组的值

通过数组的下标进行赋值操作改变元素的值。

ages[0] = 15;
System.out.println("第一个元素是:"+ages[0]);

运行结果:image-20211002143514584

2.3.3 数组的遍历

//数组的遍历
		for(int index = 0;index < ages.length;index++) {
			System.out.println("数组的第"+(index+1)+"个元素是"+ages[index]+";");
		}

运行结果:image-20211002143936438

2.4 不常见的格式

2.4.1 数据类型[] 数组名称 ;

只声明不初始化。

int[] nums;

2.4.2 数据类型[] 数组名称  = new 数据类型[]{元素1,元素2...};

声明且初始化。

int[] ages1 = new int[] {1,2,3,4,5};

3.数组常见问题

3.1 ArrayIndexOutOfBoundsException

数组下标越界异常:

/*
		 * 1.数组下标越界问题:超出下标范围边界
		 */
		int[] numbers = {10,11,12,13,14};
		System.out.println(numbers[5]);

运行结果:image-20211002145752118

3.2 NullPointerException

空指针异常:

/*
		 * 2.空指针问题
		 */
		int[] nums = null;
		System.out.println(nums[0]);

运行结果:image-20211002150347063

4.数组常用算法

4.1 寻找最大值或最小值

// 寻找数组中的最大值 或最小值
		int[] num = {10,11,16,13,15,1515,6,80};
		/*1.创建一个变量用来存储遍历数组中发现的最大值*/
		//初始化变量用数组第一个元素
		int m = num[0];
		int n = num[0];
		/*
		 * 2.遍历数组
		 * 因为m已经是第一个元素所以可以从第二个元素开始比较
		 */
		for(int i = 0;i num[i] ? num[i] : n;
		}
		System.out.println("数组最大的值为:"+m+"\n数组最小值为:"+n);

运行结果:image-20211002151702773

4.2 冒泡排序

比较相邻的两个元素,数值大的放在右边,数值小的放在左边。

int[] num = { 5, 8, 5, 1 };
//---------------------------------------方法一--------------------------------------------
		//比较相邻的两个元素 小的值放左侧
		boolean flag = false;
		do {
			flag = false;
			for(int i = 0;i < num.length-1;i++ ) {
				if(num[i] > num[i+1]) {
					//交换两个数
					num[i] = num[i]^num[i+1];
					num[i+1] = num[i]^num[i+1];
					num[i] = num[i]^num[i+1];
					//是否需要循环
					flag = true;
				}
			}
		}while(flag);
		System.out.println("-------------while循环--------------");
		for(int i = 0 ;i < num.length;i++) {
			System.out.print(num[i]);
		}
//----------------------------------------------------------------------------------------
		System.out.println();
//---------------------------------------方法二--------------------------------------------
		int temp;
		//外层循环次数 比较的轮数
		for (int i = 0;i < num.length - 1;i++) {
			//内层循环比较的每轮比较的次数
			for(int j = 0;j < num.length - i -1;j++) {
				//左边比右边大  满足移动条件
				if(num[j] > num[j+1]) {
					//两个数字进行交换
					temp = num[j];
					num[j] = num[j+1];
					num[j+1] = temp;
				}
			}
		}
		System.out.println("-------------for循环--------------");
		for(int i = 0 ;i < num.length;i++) {
			System.out.print(num[i]);
		}

运行结果:image-20211002174034437

4.3 二分查找

二分查找也称折半查找,它是一种效率较高的查找方式。但是,二分查找要求数组数据必须采用顺序存储结构有序排列

int[] num = {1,1,5,3,4,6,2,5};
		//查找6的位置
		//排序
		boolean flag = false;
		do {
			flag = false;
			for(int i = 0;i < num.length-1;i++) {
				if(num[i] > num[i+1]) {
					num[i] = num[i] ^ num[i+1];
					num[i+1] = num[i] ^ num[i+1];
					num[i] = num[i] ^ num[i+1];
					flag = true;
				}
			}
		}while(flag);
		//-----------------------------普通做法--------------------------------------
		for(int i = 0;i < num.length;i++) {
			if(num[i] == 6) {
						System.out.println("6在第"+(i+1)+"位");
			}
		}
		//---------------------------------------------------------------------------
		int target = 6;
		//最小下标
		int minIndex = 0;
		//最大下标
		int maxIndex = num.length-1;
		//中间下标
		int middleIndex = 0;
		//如果中间下标的值大于要查找的值 说明要找的值在中间的右边,那么最大下标是中间下标的减一
		while(true) {
			//中间下标
			middleIndex = (minIndex+maxIndex)/2;
			if (num[middleIndex] > target) {
				maxIndex = middleIndex - 1;
			}else if(num[middleIndex] < target){
				minIndex = middleIndex + 1;
			}else {
                //找到位置
				break;
			}
            if(minIndex>maxIndex) {
                middleIndex = -1;
                break;
            }
		}
		if(middleIndex == -1) {
            System.out.println("未找到该目标!");
        }else{
            System.out.println(target+"在第"+(middleIndex+1)+"位");
        }

运行结果:image-20211002190630925

5.多维数组

二维数组:

//创建格式
		/*
		 * 数据类型[][] 数组名 = new 数据类型[数组长度][]
		 */
		int[][] nums = new int[10][];
		nums[0] = new int[] {1,2,3};
		System.out.println(nums[0][0]);

image-20211002193611014