一 : 数组
当同类型的数据多的时候 通过变量来表示 不现实
概念 : 装相同类型指定个数个数据的容器
明确1 : 数组是容器: 装多个数据 : 是复杂数据 不再是基本数据类型
明确2 : 数组创建时必须明确所装的数据类型
明确3 : 数组创建时必须明确所装的数据的个数
类型 : 引用数据类型(非八种基本数据类型 byte short char int long float double boolean)
对象 : 复杂的数据
元素 : 数组中的数据称之为数组的元素
关键字 : [ ]
//创建数组:装所有同学的年龄
//必须指定元素类型:int
//必须指定元素个数:27
//创建数组格式1:元素类型[] 对象名=new 元素类型[元素个数];
int[] arr1=new int[27];
int age =11;
//创建数组格式2:元素类型[] 对象名=new 元素类型[]{值1,值2,值3...};
int[] arr2=new int[] {20,21,23,24,22};
//创建数组格式3:元素类型[] 对象名={值1,值2,值3...};
int[] arr3={1,5,6,7,8,3};
二 : 创建数组语句详解
int[] arr=new int[20]
int[] arr4=new int[27];
//左边: int[] arr4: 定义一个引用arr4 此引用要指向一个int类型的数组
//右边: new int[27]; 创建一个装27个int类型数据的数组对象
// new 创建对象的关键字
// [] 创建的对象是数组
// int 27 : 此数组装27个int类型的元素
// = :左边的数组名指向右边的数组对象
//打印变量 打印的是变量的值
System.out.println(age);//11
//打印引用 打印的是引用指向的对象类型@对象内存地址
三 : 数组优点
//1数组会为其中的元素自动分配编号(索引 下标 编号)
// 索引从0开始
//2 通过数组名+编号即可调用对应下标处的元素
// 格式:对象名[索引]
int[] arrAge= {1,2,3,4,5};
arrAge[2]=4;//给下标为2的元素赋值
System.out.println("第三个元素的值="+arrAge[2]);
四 : 数组使用
//注意事项1:arrAgeNew=arrAge:俩个引用指向同一个对象
int[] arrAgeNew;//定义一个数组名
arrAgeNew=arrAge;//让引用arrAgeNew指向arrAge指向的数组对象
//其实是给40行的对象又新起的名字arrAgeNew
arrAgeNew[0]=1;
System.out.println(arrAge[0]);
//注意事项2:每个new就是创建一个新的对象
int[] arra=new int[12];
int[] arrb=new int[12];//俩个引用arra arrb指向不同的数组对象
arrb=new int [12];//让引用arrb指向新的对象
//注意事项3: 方式3不能把定义引用和创建对象分开写
//创建数组格式3:元素类型[] 对象名={值1,值2,值3...};
//是格式2的简化方式:编译器会自动补齐为:
// 元素类型[] 对象名=new 元素类型[]{值1,值2,值3...};
short[] arrc = {1,2,3,4,5};
//short[] arrc= new short[]{1,2,3,4,5};
int arr[];
//arr= {1,2,3}//报错
//注意事项4:当访问的下标不存在时:报错:ArrayIndexOutOfBoundsException
// System.out.println(arrc[6]);
// Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
// at com.zhiyou100.day03.array.Demo03Array.main(Demo03Array.java:62)
//注意事项5:知道元素具体值就用方式2 3 不知道元素具体值就使用方式1
int[] arrAge1=new int[27];//对班级年龄进行统计
int[] arrAge2=new int[] {1,2,3,4,5};//排序
//注意事项6:数组中的元素有默认初始值(取决于元素的类型)
System.out.println((new byte[1][0]));//0
System.out.println((new short[1][0]));//0
System.out.println((new int[1][0]));//0
System.out.println((new char[1][0]));//''
System.out.println((new long[1][0]));//0L
System.out.println((new float[1][0]));//0.0f
System.out.println((new double[1][0]));//0.0
System.out.println((new boolean[1][0]));//false
五 : 排序
5.1 互换值
//实现俩个变量互换值
int a=2,b=4;
System.out.println("a="+a+",b="+b);
int k=a;//a=2 b=4 k=2
a=b;//a=4 b=4 k=2
b=k;//a=4 b=2 k=2
System.out.println("a="+a+",b="+b);//a=4 b=2
a=a+b;//a=6 b=4
b=a-b;//a=6 b=2
a=a-b;//a=4 b=2
5.2顺序排序
概念 : 依次拿当前元素和其后面所有元素做比较
//顺序排序
arr=new int[] {1,5,2,7,6,3};
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+(i==arr.length-1?"\n":";"));
}
//1打印比较细节
//外层for循环控制比较的轮数:arr[i]作为当前元素
for (int i = 0; i < arr.length-1; i++) {
//内层for循环控制本轮比较的次数: arr[j]作为当前元素后面的所有元素
for (int j = i+1; j < arr.length; j++) {
//拿arr[i]和arr[j]作比较
System.out.print("arr["+i+"]-arr["+j+"]\t");
}
System.out.println();
}
//2 把打印更改为互换
for (int i = 0; i < arr.length-1; i++) {
for (int j = i+1; j < arr.length; j++) {
//拿arr[i]和arr[j]作比较
if(arr[i]<arr[j]) {
int k=arr[i];
arr[i]=arr[j];
arr[j]=k;
}
}
}
//打印数组元素
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+(i==arr.length-1?"\n":";"));
}
}
5.3冒泡排序
依次拿相邻元素做比较
打印比较细节
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-i-1; j++) {
//拿arr[j]和arr[j+1]
System.out.print("arr["+j+"]-arr["+(j+1)+"]\t");
}
System.out.println();
}
把打印更改为比较
for (int i = 0; i < arr.length-1; i++) {//保证比较length-1轮
for (int j = 0; j < arr.length-i-1; j++) {
//拿arr[j]和arr[j+1]
//让arr[j]作为相邻元素前面的元素
//让arr[j+1]作为相邻元素后面的元素
if (arr[j]>arr[j+1]) {
int k=arr[j];
arr[j]=arr[j+1];
arr[j+1]=k;
}
}
}
5.4 : 顺序排序和冒泡排序的比较
顺序排序和冒泡排序效率完全一样
顺序排序和冒泡排序外层for循环代码完全相同
顺序排序内层for循环 变量j从i+1开始 到length结束
冒泡排序内层foe循环 变量j从0开始 到length-i-1结束
顺序排序比较时 是拿arr[i]和arr[j]比较
冒泡排序比较时 是拿arr[j]和arr[j+1]比较