数组
1、相同数据类型的【数据容器】
2、顺序排列
创建
1、 数据类型[] 数组名 = {数据1,数据2,数据3…数据n};
//数组的创建
//第一种方式:数据类型[] 数组名 = {数据1,数据2,数据3,......数据n};
int[] a = {1,2,3,4,5,6,7,8};
2、 数据类型[] 数组名 = new 数据类型[数组长度]; // 数组长度通过int数据指定。
//第二种方式:数据类型[] 数组名 = new 数据类型[数组长度];
int[] n = new int[6];
3、不常用创建数组的方式
//不常用的创建方式
int[] b; //这种方式如果用的话 只能new
int[] c = new int[] {1,2,3,4,5,5,4};
遍历
1、指定索引遍历
System.out.println(a[0]);
2、for循环
for(int index = 0; index < a.length; index++) {
System.out.println(a[index]);
}
数组常见问题
1、数组下标越界异常
//报错:ArrayIndexOutOfBoundsException
//意思就是 最后一位数的 下标是6 我们寻找的是下标是9的 所以没有
int[] c = new int[] {1,2,3,4,5,5,4};
System.out.println(c[9]);
2、空指针异常
//报错:NullPointerException
///在不常用数据类型的时候 如下图 没有值默认就是null
int[] a;
System.out.println(a[1]);
常用算法
1、寻找数组中的最大值或最小值
//定义数组
int[] c = {1,2,3,4,5,5,4,9,89,8,9,7,12,8,8,8,8,23};
//自定义变量 d也就是数组中的第一个数
int d = c[0];
for(int i = 1;i < c.length; i++) {
//用数组中的第一个数 与数组中的第二个数比较 三目运算符。以此类推 最大值 或者最小值
d = d > c[i]?d:c[i];
}
System.out.println(d);
2、冒泡排序:比较相邻2个数 然后进行位置替换,每一轮比较只能得出一个最大值,然后再比较一轮再得出一个最大的,一直比较到不需要再比较 。
外层循环控制轮数:length-1
内存循环控制次数:比较次数 第i轮 比较次数:length-i-1
int[] c = {1,2,3,4,5,5,4,9,89,8,9,7,12,8,8,8,8,23};
//用于替换的变量
int bb ;
//外层控制循环次数: length-1
for(int i = 0;i < c.length-1; i++) {
//内层控制 比较的次数 length-i-1
for(int j = 0;j < c.length-i-1; j++) {
//第一个 大于第二个
if(c[j] > c[j+1]) {
//赋值给变量 进行替换
bb = c[j];
c[j] = c[j+1];
//最大的放后面
c[j+1] = bb;
}
}
}
for(int i = 0;i < c.length; i++) {
System.out.println(c[i]);
}
3、二分查找法(首先是有序排列才可以)
/**
*1、确定查找范围 最小下标----最大下标
*2、计算中间下标 (最小 + 最大下标)/2
*3、比较中间下标:中间数据大 则最大下标 = 中间下标 - 1
* :中间数据小 则最小下标 = 中间下标 + 1
*4、当最小下标 > 最大下标时 , 说明数据不存在
*/
public static void main(String[] args) {
int[] nums = {1,2,3,4,5,6,7,8,9,10,11,12,13,45};
//要查找的数据
int a = 5;
//最关键的3个变量
// 最小范围的下标
int minIndex = 0;
//最大范围的下标
int maxIndex = nums.length-1;
//中间下标
int centerIndex = (minIndex + maxIndex)/2;
//因为循环的轮数不确定 所以写一个死循环
while(true) {
//中间数据较大
if(nums[centerIndex] > a) {
maxIndex = centerIndex -1;
//中间数据较小
}else if(nums[centerIndex] < a) {
minIndex = centerIndex +1;
//找到了数据 : 数据的位置是 centerIndex
}else {
break;
}
//最小下标 大于 最大下标
if(minIndex > maxIndex) {
//也就是没有数据
centerIndex = -1;
break;
}
//当位置发生变化的话 更新中间下标
centerIndex = (minIndex + maxIndex)/2;
}
System.out.println("需要找到的数据下标是:"+centerIndex);
}