什么是数组? 数组是用来干嘛的? 假如我们要做一个成绩管理系统,一个班级里面有50个人。 假如我们做的是一个公司的财务管理软件,需要记录每个人的工资,公司有30到1000 个员工。 使用数组可以搞定上面的: 数组可以存储多个类型一致的元素。(任意类型) 引用类型和基本类型变量创建的不同 基本类型变量声明出来不管是否赋值,都已经分配了内存。 引用类型变量的创建分为两步:声明和初始化 声明只在栈内分配内存(存储引用,或者说存储内存地址) 初始化在堆或者方法区分配内存(存储实际的数据) new出来的东西放在堆里面 程序运行常量放在方法区里面 关于栈 所有局部变量都存放在栈里面。 什么是局部变量? 在方法里面创建的变量都是局部变量,因为只在这个方法内有效。 数组和字符串都是引用数据类型 一维数组的声明、初始化和使用 第一步:声明 声明第一种方式:数组元素类型[] 数组名;
int [] scoreArray=null;声明第二种方式:数组元素类型 数组名[];
int scoreArray[];注意:没有初始化的数组是无法使用的。(可以初始化为null) 第二步:初始化 初始化的时间: 可以在声明的时候直接初始化 也可以先声明后初始化 初始化的方式:(初始化的时候必须确定数组的长度) 第一种方式:int[] shuzu = new int[3];//按照默认值初始化 0 第二种方式:int[] shuzu = new int[]{3,32,34};//长度根据元素个数确定 第三种方式:int[] shuzu = {23,234,23,4}//上面的简化版本,根据元素个数确 定数组长度 数据类型的默认值 基本类型是0(0 0.0 0所代表的字符 false ) 引用类型是null
第三步:使用 使用: 通过索引访问数组里面元素,索引是从0开始。 访问方式:数组名[索引] //可以访问值,也可以设置值 获取数组长度 数组名.length 这里的length是属性,不是方法,不需要加括号 注意事项 数组之间的赋值 引用类型的赋值 下标超出范围 //严重 空引用int[] shuzu = null; shuzu[index] //严重 数组的其他操作: 填充数组 Arrays.fill(数组名,值);//使用指定的值填充指定的数组,需要import java.util.Arrays 编程练习 一、遍历一个数组中所有的元素,并输出出来
int[] scoreArray=new int[]{234,54,76,4,48}; for(int i=0;i<scoreArray.length;i++) { System.out.println(scoreArray[i]); }二、请将’A’,’B’,’C’存入数组,然后再输出
char[] c=new char[3]; c[0]='A'; c[1]='B'; c[2]='C'; for(int i=0;i<c.length;i++) { System.out.println(scoreArray[i]); }三、复制数组,将数组里面的数据全部复制到另一个数组里面
int[] scoreArray=new int[]{23,45,76,84,235,4} int[] newArray=new int[scoreArray.length]; for(int i=0;i<scoreArray.length;i++) {newArray[i]=scoreArray[i]; } for(int i=0;i<newArray.length;i++) { System.out.println(newArray[i]+" "); }四、取得一个数组里面的最大值和最小值
int[] scoreArray=new int[]{267,65,989,87,45}; int max=scoreArray[0]; for(int i=1;i<scoreArray.length;i++) { if(scoreArray[i]>max){ max=scoreArray[i]; } } int min=scoreArray[0]; for(int i=1;i<scoreArray.length;i++) { if(scoreArray[i]<min){ min=scoreArray[i]; } } System.out.println("最大值是:"+max); System.out.println("最小值是:"+min);五、把数组里面的元素倒置( {234,3,34,25,3} => {3,25,34,3,234} ) for循环的特殊用法
int[] a={2,34,76,87,5}; for(int i=0;i<a.length/2;i+=) { int temp=a[i]; a[i]=a[a.length-1-i]; a[a.length-1-i]=temp; }六、现在有如下一个数组: int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; 要求将以上数组中的0项去掉,将不为0的值存入一个新的数组,生成新的数组为 int newArr[]={1,3,4,5,6,6,5,4,7,6,7,5}
int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; int count=0; for(int i=0;i<oldArr.length;i++) { if(oldArr[i]!=0) { count++; } } int[] newArr=new int[count]; int number=0; for(int i=0;i<oldArr.length;i++) { if(oldArr[i]!=0){ newArr[i]=oldArr[i]; number++; } } }七、数据查找,有一个数组,里面存储是是整数,从这个里面查找一个指定整数,找到 这个整数所在位置(索引位置)。(查找第一个出现的位置)
int oldArr[]={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}; int numberToFind=7; int index=-1; for(int i=0;i<oldArr.length;i++) { if(oldArr[i]==numberToFind) { index=i;break; } }二维数组的声明、初始化和使用 为什么用二维数组? 假如我们要做一个成绩管理系统,一个班级里面有50个人。 假如我们做的是一个公司的财务管理软件,需要记录每个人的工资,公司有40个员工。 对上面的问题进行升级 假如我们要做一个成绩管理系统,我们有10个班级,一个班级里面有50个人。 假如我们做的是一个公司的财务管理软件,需要记录每个人的工资,公司有6个部门, 每个部门有40个员工。
1、声明 声明第一种方式:数据类型[][] 数组名; 声明第二种方式:数据类型 数组名[][]; 2、初始化 初始化第一种方式:数组名=new 数据类型[m][n]; 初始化第二种方式:数组名= {{2,5},{1},{3,2,4},{1,7,5,9}}; 可以把二维数组当成多个一维数组组成的一维数组,比如这里的就是一个长度 为m 的一维数组,这个数组里面每一个元素都是长度为n的一维数组。(画图 表示二维数组在内存中怎么存储的)
初始化第三种方式:数组名= new 数据类型[m][]; m表示里面有多少个一维数组,但是没有给出这个一维数组的长度。这里的每 个一维数组的长度是可以不一样的。 int[][] school= new int[3][]; school[0]=new int[2]; //或者=new int[] {xx,x,x,xxx,xx}; school[1]=new int[3]; //或者= {xx,x,x,xxx,xx}; school[2]=new int[1];
3、使用 格式:数组名[索引][索引] 通过数组名[索引] 得到的是一维数组,完全可以当做一维数做来使用 二维数组的编程练习 一、遍历二维数组里面的所有元素,并输出出来。 (遍历一个规则的,里面所有一维数组的长度是一样的,遍历一个不规则的,里面 一维数组的长度是不一样的)
数组排序 冒泡排序 直接选择排序
练习题
一、定义一个数组来存储12个学生的成绩{72,89,65,58,87,91,53,82,71,93,76,68},计算 并输出学生的平均成绩。
二、在歌唱比赛中,共有10位评委进行打分,在计算歌手得分时,去掉一个最高分,去掉 一个最低分,然后剩余的8位评委的分数进行平均,就是该选手的最终得分。输入每个 评委的评分,求某选手的得分。
三、声明一个int型的数组,循环接收8个学生的成绩,计算这8个学生的总分及平均分、 最高分和最低分。