数组
数组
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);
运行结果:
2.3 操作数组元素
2.3.1 获取数组元素
通过数组下标进行取值。
System.out.println("第一个元素是:"+ages[0]);
运行结果:
2.3.2 改变数组的值
通过数组的下标进行赋值操作改变元素的值。
ages[0] = 15;
System.out.println("第一个元素是:"+ages[0]);
运行结果:
2.3.3 数组的遍历
//数组的遍历
for(int index = 0;index < ages.length;index++) {
System.out.println("数组的第"+(index+1)+"个元素是"+ages[index]+";");
}
运行结果:
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]);
运行结果:
3.2 NullPointerException
空指针异常:
/*
* 2.空指针问题
*/
int[] nums = null;
System.out.println(nums[0]);
运行结果:
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);
运行结果:
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]);
}
运行结果:
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)+"位");
}
运行结果:
5.多维数组
二维数组:
//创建格式
/*
* 数据类型[][] 数组名 = new 数据类型[数组长度][]
*/
int[][] nums = new int[10][];
nums[0] = new int[] {1,2,3};
System.out.println(nums[0][0]);