为什么需要使用数组:
当有多个数值的时候.需要定义多个变量,较为麻烦,使用数组的话只需要定义一个变量直接开辟一串空间
数组是一个变量,存储相同数据类型的一组数据
变量:声明一个变量就是在内存中开辟一个合适大小的空间
数组:声明一个数组就是在内存中开辟一连串的连续空间
数组的名称,用于区分不同的数组
向数组中存放的数据
对数组元素进行编号,从0开始,数组中的每个元素都可以通过下标来访问
数组元素的数据类型
声明一个变量就是在内存空间划出一块合适的空间
声明一个数组就是在内存空间划出一串连续的空间
数组长度和类型一旦定义不会改变
数组中的所有元素必须属于相同的数据类型
数组类型 数组名 [];
数组类型[] 数组名; //常用写法
int[] a;
int a[];
String[] name;
数组类型[] 数组名 = new 数据类型[大小];
a=new int[5];
数组名[元素下标] =要赋的值;
a[0]=8;
赋值:
数组类型[] 数组名 = {x ; y ; z};
int[ ] score = {89, 79, 76};
数组类型[] 数组名 = {x ; y ; z};
int[ ] score = new int[ ]{89, 79, 76};
Scanner input = new Scanner(System.in);for(int i = 0; i < 30; i ++){ score[i] = input.nextInt();}
a[0]=a[0]*10;
案例:
//计算5位学生的平均分: int [ ] score = {60, 80, 90, 70, 85}; double avg; avg = (score[0] + score[1] + score[2] + score[3] + score[4])/5; 但是如果像上面写法的话还是会有弊端的,如:学生的个数有变动,那我们的循环次数和求平均分的时候除以的数都需要修改,我们有一个方法避免修改多处动态的获取数组的长度。 score.length
编译出错:没写明数组的大小:int [] score= new int[];
编译出错:数组下标越界:int [] score= new int[2];
score[0]=11;
score[1]=11;
score[2]=11; //下标越界了
编译出错:数组的声明和赋值在多行:
int [] score;
score={11,22,33,21};
返回值类型方法名称说明booleanequals(array1,array2)比较array1和array2两个数组是否相等 sort(array)对数组array的元素进行升序排列StringtoString(array)将一个数组array转换成一个字符串 fill(array,val)把数组array所有元素都赋值为val原数组什么类型复制的新数组也是什么类型copyOf(array,length)把数组array复制成一个长度为length的新数组,返回类型与复制的数组一致intbinarySearch(array, val)查询元素值val在数组array中的下标(要求数组中元素已经按升序排列)
案例:
@Test public void test05(){ int[] array1 ={12,21,13}; int[] array2 ={12,21,13}; int[] array3 ={12,21,13,24}; //int binarySearch(array, val) 查询元素值val在数组array中的下标(要求数组中元素已经按升序排列) Arrays.sort(array3); int i =Arrays.binarySearch(array3,13); System.out.println(i); //copyOf(array,length) 把数组array复制成一个长度为length的新数组,返回类型与复制的数组一致 /*int array4[] =Arrays.copyOf(array3,6); System.out.println(Arrays.toString(array4));*/ /*//void fill(array,val) 把数组array所有元素都赋值为val Arrays.fill (array3,22); System.out.println(Arrays.toString(array3)); //sort(array) 对数组array的元素进行升序排列 //String toString(array) 将一个数组array转换成一个字符串 Arrays.sort(array3); System.out.println(Arrays.toString(array3)); // boolean equals(array1,array2); 比较 array1 和 array2 是否相等 boolean a=Arrays.equals(array1,array2); boolean b=Arrays.equals(array1,array3); System.out.println(a+","+b);*/ }
为什么学习多维数组:如遇5个班各5名学生的信息
概念:从内存角度看只有一-维数组,java是支持多维数据的但是二维以上的数组很少使用,只要用二维数组
二维数组:其实是数组的数组
语法:
[ ][ ] 数Ä名; 或者 数Ä名 [ ][ ];int [ ][ ] scores; //定义二维数组scores=new int[5][50]; //分配内存空间 或者int [ ][ ] scores = new int[5][50]; 常见问题定义二维数组时,要定义最大维数:int [ ][ ] scores = new int[5][]; 后面的中括号是可以省略的int [ ][ ] scores = new int[][]; 不能省略前面的或者都省略二维数组实际上是一个一维数组,它的每个元素又是一个一维数组 赋值int[][] scores=new int[3][5]; score[0][0]=90; score[2][3]=70; 方法一: int[][] scores=new int[][]{ { 90, 85, 92, 78, 54 }, { 76, 63,80 }, { 87 }}; 方法二: int scores[][] = {
{ 90, 85, 92, 78, 54 }, { 76, 63,80 }, { 87 } };
最后再补充一点关于equals 和 == 的区别哈!!!
==
既可以比较数值类型,也可以比较引用数据类型。当比较的是数值类型的时候比较的是值比较的是引用数据类型的是后,比较的就是地址值
equals
如果没有对equals方法进行重写的时候,比较的方式和==是一样的,如果重写的则按照重写的方式进行比较
在使用equals 的时候我们将肯定有值的变量写在前面,避免空指针异常地出现
案例:
@Test public void test2(){ String i =null;//String 的默认值 为空 if (i.equals("")){ System.out.println("合格"); } System.out.println("程序结束"); }//此时运行会报错@Test public void test2(){ String i =null; if ("".equals(i)){ System.out.println("合格"); } System.out.println("程序结束"); }//换位后运行正常
重复做的事使用循环那如计算3个班级各5名学生的成绩平均分就需要两个循环
简单来说,就是循环里面套一个循环
语法:while的双重循环while(循环条件1) { //循环操作1 while(循环条件2) { //循环操作2 }} do { //循环操作1 do { //循环操作2 }while(循环条件1);}while(循环条件2); for(循环条件1) { //循环操作1 for(循环条件2) { //循环操作2 }} while(循环条件1) { //循环操作1 for(循环条件2) { //循环操作2 }} 特点:外层循环一次,内层循环一遍
案例1:
//计算三个班级的四个学生的成绩平均分 Scanner sc = new Scanner(System.in); double score=0; double sum=0; for(int i=0;i<3;i++){ //循环的是班级 System.out.println("请输入第 "+(i+1)+"个班级的学生成绩:"); sum=0; for(int j=0;j<4;j++){ //循环的是班级的每个学生 System.out.println("请输入第 "+(j+1)+"个学生的成绩:"); score=sc.nextDouble(); sum+=score; } System.out.println("第 "+(i+1)+"个班级学生的总成绩是:"+sum); System.out.println("第 "+(i+1)+"个班级学生的平均分是:"+sum/4); }
:案例2(进阶):
1.打印各种图形(矩形、直角三角形、倒直角三角形、等腰三角形、平行四边形、菱形、数字菱形、空心菱形) 打印四边形的星星
1 提示:外层循环控制行数,内层循环控制列数2 //打印矩形的星星3 for(int i=1;i<=5;i++){4 for(int j=1;j<=5;j++){5 System.out.print("*");6 }7 System.out.println(); 8 }
打印直角三角形的图案
1 //打印直角三角形 2 Scanner sc = new Scanner(System.in); 3 System.out.println("请输入三角形的行数:"); 4 int num=sc.nextInt(); 5 for(int i=1;i<=num;i++){ 6 for(int j=1;j<=(2*i-1);j++){ 7 System.out.print("*"); 8 } 9 System.out.println();10 }
打印倒直角三角形
1 //打印直角三角形 2 Scanner sc = new Scanner(System.in); 3 System.out.println("请输入三角形的行数:"); 4 int num=sc.nextInt(); 5 for(int i=1;i<=num;i++){ 6 for(int j=1;j<=(num+1-i);j++){ 7 System.out.print("*"); 8 } 9 System.out.println();10 }
打印等腰三角形(如下图效果)
1 //打印等腰三角形 2 Scanner sc = new Scanner(System.in); 3 System.out.print("请输入您要打印的行数:"); 4 int num=sc.nextInt(); 5 for(int i=1;i<=num;i++){ 6 for(int j=1;j<=num-i;j++){ 7 System.out.print(" "); 8 } 9 for(int k=1;k<=(2*i-1);k++){10 System.out.print("*");11 }12 System.out.println();13 }
打印平行四边形(如下图效果)
1 //输出平行四边形 2 for(int i = 0;i<5;i++){ 3 //循环输出空格 4 for(int j=0;j<5-i-1;j++){ 5 System.out.print(" "); 6 } 7 //循环输出* 8 for(int k = 0;k<=5;k++){ 9 System.out.print("*");10 }11 System.out.println();12 }
打印菱形
1 //输出菱形 2 //先输出等腰三角形 3 for(int i = 1;i<=5;i++){ 4 //循环输出空格 5 for(int j=5-i;j>0;j--){ 6 System.out.print(" "); 7 } 8 //循环输出* 9 for(int k = 0;k<2*i-1;k++){10 System.out.print("*");11 }12 System.out.println();13 }14 //再输出一个4行的倒三角形15 for(int i = 1;i<=4;i++){16 //循环输出空格17 for(int j=1;j<=i;j++){18 System.out.print(" ");19 }20 //循环输出*21 for(int k = 0;k<2*(5-i)-1;k++){ // 2*(5-i)-1 9-2i22 System.out.print("*");23 }24 System.out.println();25 }
打印数字菱形
1 //输出数字菱形 2 //先输出等腰三角形 3 for(int i = 1;i<=5;i++){ 4 //循环输出空格 5 for(int j=5-i;j>0;j--){ 6 System.out.print(" "); 7 } 8 //循环输出* 9 for(int k = 0;k<2*i-1;k++){10 System.out.print((5-i));11 }12 System.out.println();13 }14 //再输出一个4行的倒三角形15 for(int i = 1;i<=4;i++){16 //循环输出空格17 for(int j=1;j<=i;j++){18 System.out.print(" ");19 }20 //循环输出*21 for(int k = 0;k<2*(5-i)-1;k++){ // 2*(5-i)-1 9-2i22 System.out.print(i);23 }24 System.out.println();25 }
打印空心菱形
===========================================================
2.//若有3个班级各4名学员参赛,计算每个班级参赛学员平均分,统计成绩大于80分学员数 Scanner sc = new Scanner(System.in); double avg=0; double sum=0; double score=0; int num=0; for(int i=1;i<=3;i++){ System.out.println("请输入第 "+i+"个班级的成绩:"); sum=0; for(int j=1;j<=4;j++){ System.out.print("请输入第 "+j+"个同学的成绩:"); score=sc.nextDouble(); sum+=score; if(score<80){ continue; } num++; } System.out.println("第 "+i+"个班的平均分是:"+sum/4); } System.out.println("80分以上的学院个数为:"+num);===========================================================3.循环和break相结合的联系Scanner sc = new Scanner(System.in); String answer=""; int num=0; for(int i=1;i<=5;i++){ System.out.println("欢迎光临第 "+i+"家店"); for(int j=1;j<=3;j++){ System.out.print("要离开么(y/n): "); answer=sc.next(); if(answer.equals("y")){ System.out.println("离店结账"); break; } num++; } } System.out.println("一共买了 "+num+"件衣服");
===========================================================
5.冒泡排序、选择排序、插入排序的代码和对比
1 一共是比较了数组长度的-1轮,每一轮比较的次数都是比上一次少一次 2 //打印冒泡 3 int [] arr={21,77,23,32,1,99}; 4 System.out.println("排序之前:"); 5 for(int i=0;iarr[j+1]){13 int temp=arr[j];14 arr[j]=arr[j+1];15 arr[j+1]=temp;16 }17 }18 } 19 System.out.println("排序之后:");20 for(int i=0;i
1 //插入排序 2 int[] arr = {3,42,54,2,56,7,76}; 3 for(int i =1;i=0;j--){ //j就是被比较的数:42,j>=0是从i向前比较,直到数组的下标为0. 7 //判断temp是否大于被比较的数42 8 if(arr[j] > temp){ 9 //如果temp小于被比较的数42,就要交换位置,即把arr[j]的值赋值给后面一位arr[j+1].此时不用担心后面的数被覆盖后找不到,10 //因为已经赋值给了temp11 arr[j+1] = arr[j]; //赋值之后返回单for循环,j--,此时j相当于i-212 }else{13 //如果temp大于别比较的数42,不需要交换位置 .此时break后,j不用--,即j的值没变14 break;15 }16 }17 18 //接着判断是否发生了交换。如果没有交换,此时arr[j+1] == temp ; 如果交换了,j也减了1,此时arr[j+1] != temp19 if(arr[j+1] != temp){20 //说明发生了交换。则把temp赋值给arr[j+1]21 arr[j+1] = temp;22 }23 }24 //遍历输出数组,检测25 for(int i:arr){26 System.out.print(i+" ");27 }
1 //选择排序 2 //int[] arr = {1,3,42,54,2,56,7,76,4}; 3 int index = 0; 4 for(int i = 0;iarr[j]){ 8 index = j; 9 }10 } 11 if(index != i){12 arr[index] = arr[index]+arr[i];13 arr[i] = arr[index] - arr[i];14 arr[index] = arr[index] - arr[i];15 }16 }17 for(int i:arr){18 System.out.print(i+" ");19 }
5.冒泡排序、选择排序、插入排序的代码和对比
1 一共是比较了数组长度的-1轮,每一轮比较的次数都是比上一次少一次 2 //打印冒泡 3 int [] arr={21,77,23,32,1,99}; 4 System.out.println("排序之前:"); 5 for(int i=0;iarr[j+1]){13 int temp=arr[j];14 arr[j]=arr[j+1];15 arr[j+1]=temp;16 }17 }18 } 19 System.out.println("排序之后:");20 for(int i=0;i
1 //插入排序 2 int[] arr = {3,42,54,2,56,7,76}; 3 for(int i =1;i=0;j--){ //j就是被比较的数:42,j>=0是从i向前比较,直到数组的下标为0. 7 //判断temp是否大于被比较的数42 8 if(arr[j] > temp){ 9 //如果temp小于被比较的数42,就要交换位置,即把arr[j]的值赋值给后面一位arr[j+1].此时不用担心后面的数被覆盖后找不到,10 //因为已经赋值给了temp11 arr[j+1] = arr[j]; //赋值之后返回单for循环,j--,此时j相当于i-212 }else{13 //如果temp大于别比较的数42,不需要交换位置 .此时break后,j不用--,即j的值没变14 break;15 }16 }17 18 //接着判断是否发生了交换。如果没有交换,此时arr[j+1] == temp ; 如果交换了,j也减了1,此时arr[j+1] != temp19 if(arr[j+1] != temp){20 //说明发生了交换。则把temp赋值给arr[j+1]21 arr[j+1] = temp;22 }23 }24 //遍历输出数组,检测25 for(int i:arr){26 System.out.print(i+" ");27 }
1 //选择排序 2 //int[] arr = {1,3,42,54,2,56,7,76,4}; 3 int index = 0; 4 for(int i = 0;iarr[j]){ 8 index = j; 9 }10 } 11 if(index != i){12 arr[index] = arr[index]+arr[i];13 arr[i] = arr[index] - arr[i];14 arr[index] = arr[index] - arr[i];15 }16 }17 for(int i:arr){18 System.out.print(i+" ");19 }
喜欢前端、后端java开发的可以加+qun:609565759,有详细视频、资料、教程,文档,值得拥有!!!希望可以一起努力,加油ヾ(◍°∇°◍)ノ゙!!!
B站有上传的更多项目视频,从Java基础到面向对象、Java高级API,以及SSM等框架的视频,地址:https://www.bilibili.com/video/BV15a411w7Jh