各位程序猿,各位攻城狮,各位蜥蜴鸥以及各位棕鲸鲤们~~大家好,我是潘师傅,欢迎大家收看由我为你们带来的【史上最强JavaSE笔记】系列,其实也可以叫【嘻哈JavaSE笔记】的,第一次在博客园发帖,想想还真是有点小激动呢,各位求支持呀,哈哈,那么回归正题,我把自己之前学习积累的笔记拿出来跟大家分享一下,方便大家更好的理解和复习,希望能够对大家有所帮助哈,这次发的是JavaSE方面数组篇的,内容不一定全面哦,欢迎大家前来留言交流哈,不足的地方还望大家多多指出和指导哈~(由于首次发文章,布局可能比较乱,不美观,还望大家多多指导)。
1.数组声明:
第一种:数据类型 变量名[],例如:int x[];
第二种:数据类型[] 变量名=new 数据类型[要在内存中开辟的空间数量,例如:int[] x=new int[3];
第三种:数据类型[] 变量名=new 数据类型[]{元素1,元素2,元素3};
例子1:
1 public static void main(String[] arg){ 2 3 //定义一个字符串数组,将各个元素(也就是月饼)放入其中 4 5 String[]names={"五仁月饼","香辣牛肉月饼","金嗓子月饼","韭菜月饼"}; 6 7 8 9 //通过for循环遍历一下数组,通过输出语句判断循环输出 10 11 //names.length是数组的长度,names是输出数组下标为i的元素名称 12 13 for(int i = 0;i<names.length;i++){ 14 15 System.out.println("我吃到第"+(i+1)+"个月饼是"+names); 16 17 } 18 19 }
输出结果:
我吃到第1个月饼是五仁月饼
我吃到第2个月饼是香辣牛肉月饼
我吃到第3个月饼是金嗓子月饼
我吃到第4个月饼是韭菜月饼
2.数组常见的异常(2种)
1.空指针异常(NullPointerException)
原因:数组没有分配内存空间
1 public static void main(String[] args) { 2 3 //空指针异常 4 5 //错误提示:NullPointerException 6 7 String[]names=null; 8 9 System.out.println(names[1]); 10 11 }
输出结果:
Exception in thread "main" java.lang.NullPointerException
ata2.NullPointerException(a2.java:10)
ata2.main(a2.java:5)
2.数组越界异常
原因:下标超出了数组长度
1 public static void main(String[] args) { 2 3 //数组越界异常 4 5 //ArrayIndexOutOfBoundsException 6 7 String[]names={"五仁月饼","香辣牛肉月饼","金嗓子月饼","韭菜月饼"}; 8 9 System.out.println(names[4]); 10 11 }
输出结果:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:4
ata3.main(a3.java:5)
3.数组内存结构分析
栈内存和堆内存的区别:
数组内存分为 栈内存 和 堆内存。
栈内存 中是用来存放变量名的,存放确定大小的,存的是一个内存地址,通过它可以从堆内存中找到其对应的值,存取速度比堆内存快,例如:names
堆内存 中用来存放值的,存放不确定大小的,需要动态代码运行到这一句才会确定大小,例如:"小明"
4.多维数组
习题:3个班级各4名学员参赛,计算每个班的平均成绩
1 public static void main(String[] args) { 2 //创建一个键盘输入 3 Scannerinput = newScanner(System.in); 4 //定义一个scores二维数组,第一个存班级数量,第二个存学生数量 5 int scores[][]=new int[3][4]; 6 //遍历,将输入的成绩存入到二维数组scores中 7 for (int i = 0; i < 3; i++) { 8 for (int j = 0; j < 4; j++) { 9 System.out.println("请输入第"+(i+1)+"个班级的第"+(j+1)+"个同学的成绩:"); 10 scores[j]=input.nextInt(); 11 } 12 } 13 14 //输出二位数组的每个元素 15 for (int i = 0; i < 3; i++) { 16 System.out.println("第"+(i+1)+"个班级的学员成绩:"); 17 int sum = 0; 18 for (int j = 0; j < 4; j++) { 19 System.out.println("第"+(j+1)+"个学员的成绩是:"+scores[j]); 20 sum+=scores[j]; 21 } 22 System.out.println("第"+(i+1)+"个班级的平均分是:"+(sum/4)); 23 } 24 }
输出结果:
请输入第1个班级的第1个同学的成绩:
61
请输入第1个班级的第2个同学的成绩:
71
请输入第1个班级的第3个同学的成绩:
85
请输入第1个班级的第4个同学的成绩:
92
请输入第2个班级的第1个同学的成绩:
64
请输入第2个班级的第2个同学的成绩:
73
请输入第2个班级的第3个同学的成绩:
95
请输入第2个班级的第4个同学的成绩:
66
请输入第3个班级的第1个同学的成绩:
35
请输入第3个班级的第2个同学的成绩:
73
请输入第3个班级的第3个同学的成绩:
83
请输入第3个班级的第4个同学的成绩:
94
第1个班级的学员成绩:
第1个学员的成绩是:61
第2个学员的成绩是:71
第3个学员的成绩是:85
第4个学员的成绩是:92
第1个班级的平均分是:77
第2个班级的学员成绩:
第1个学员的成绩是:64
第2个学员的成绩是:73
第3个学员的成绩是:95
第4个学员的成绩是:66
第2个班级的平均分是:74
第3个班级的学员成绩:
第1个学员的成绩是:35
第2个学员的成绩是:73
第3个学员的成绩是:83
第4个学员的成绩是:94
第3个班级的平均分是:71
优化思考:成绩为0-100分,如何在录入成绩的时候保证不录入错误呢?
分析:写入判断,如果输入的成绩大于100或者小于0,那么就提示错误,可以重新对该同学的成绩进行输入。
1 public static void main(String[] args) { 2 Scannerinput = newScanner(System.in); 3 int scores[][] = new int[3][4]; 4 for (int i = 0; i < 3; i++) { 5 for (int j = 0; j < 4; j++) { 6 System.out.println("请输入第"+(i+1)+"个班级的第"+(j+1)+"个同学的成绩:"); 7 scores[j]= input.nextInt(); 8 if (scores[j] > 100|| scores[j] < 0) { 9 10 System.out.println("输入成绩无效,成绩为0-100分,请重新输入"); 11 //方法1:通过j--将这次循环记录删除,这样下次循环就会再循环到这个同学的成绩输入 12 j--; 13 //方法2:在没有跳出循环的情况下再次输入一次 14 //System.out.println("请输入第"+(i+1)+"个班级的第"+(j+1)+"个同学的成绩:"); 15 //scores[j] = input.nextInt(); 16 } 17 18 } 19 } 20 21 for (int i = 0; i < 3; i++) { 22 System.out.println("第"+(i+1)+"个班级同学成绩:"); 23 int sum = 0; 24 for (int j = 0; j < 4; j++) { 25 System.out.println("第"+(j+1)+"个同学的成绩为:"+scores[j]); 26 sum+=scores[j]; 27 } 28 System.out.println("第"+(i+1)+"个班级的平均成绩为:"+(sum/4)); 29 System.out.println("---------------------------------------------"); 30 } 31 }
练习题:
1.猜数游戏:从键盘中任意输入一个数据,判断数列中是否包含此数。
1 public static void main(String[] args) { 2 int num[] ={3,5,7,83,23,64}; 3 boolean flag = false; 4 Scannerscan = newScanner(System.in); 5 System.out.println("猜数字游戏"); 6 System.out.println("请输出一个数字:"); 7 int input = scan.nextInt(); 8 for (int i = 0; i < num.length; i++) { 9 if (num == input) { 10 flag= true; 11 break; 12 } 13 } 14 if (flag) { 15 System.out.println("恭喜您猜对了~"); 16 }else{ 17 System.out.println("很遗憾,您猜错了~"); 18 } 19 }
2.使用字母打印正三角形.
A
BBB
CCCCC
DDDDDDD
EEEEEEEEE
FFFFFFFFFFF
GGGGGGGGGGGGG
1 public static void main(String[] args) { 2 char[] sj = {‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘}; 3 //打印的行数 4 for (int i = 0; i < sj.length; i++) { 5 //打印每行的空格数量 6 for (int j = i; j < sj.length - 1; j++) { 7 System.out.print(" "); 8 } 9 //打印每行的字母数量 10 for (int j = 0; j <= i * 2;j++) { 11 System.out.print(sj); 12 } 13 System.out.println(); 14 } 15 }
3.求数组中的最大值最小值。
1 public static void main(String[] args) { 2 int num[] = { 3, 29, 33, 6, 90, 24, 50 }; 3 int max = num[0]; 4 int min = num[0]; 5 for (int i = 0; i < num.length; i++) { 6 if (num[i] > max) { 7 max = num[i]; 8 } 9 if (num[i] < min) { 10 min = num[i]; 11 } 12 } 13 System.out.println("数组中的最大值为:" + max); 14 System.out.println("数组中的最小值为:" + min); 15 }
4.有一串数字:748,520,998,1001,250,512,502,使用冒泡排序分别对其进行由小到大,由大到小的排列起来。
1 public static void main(String[] args) { 2 int num[] ={748,520,998,1001,250,512,502}; 3 int temp; 4 for (int i = 0; i < num.length - 1; i++) { 5 for (int j = 0; j < num.length - 1 - i; j++) { 6 if (num[j] > num[j +1]) {//>是从小到大排,<是从大到小排 7 temp= num[j]; 8 num[j]= num[j + 1]; 9 num[j+ 1] = temp; 10 } 11 } 12 } 13 System.out.println("积分榜排名为:"); 14 for (int i = 0; i < num.length; i++) { 15 System.out.print(num + " "); 16 } 17 }
实战应用案例:
双色球彩票程序
1 /** 2 * 应用案例:模拟双色球彩票程序 3 * 实现步骤: 4 * 1.系统生成一个篮球和6个红球,并存储起来 5 * 2.接受用户选号,1个篮球和6个红球 6 * 3.验证系统号码与用户号码是否匹配(是否中奖) 7 * 4.公布本期中奖号码 8 */ 9 双色球彩票规则: 10 一等奖:500万,1个蓝球,6个红球 11 二等奖:一等奖的30%,6个红球 12 三等奖:3000元,1个蓝球,5个红球 13 四等奖: 200元,5个红球或者1个蓝球,4个红球 14 五等奖:10元,4个红球或者1个蓝球,3个红球 15 六等奖:5元,1个蓝球 16 程序代码如下: 17 public static void main(String[] args) { 18 int sysBlue; //系统生成的1个蓝球号 19 int[] sysRed = new int[6]; //系统生成的6个红球号 20 int userBlue; //用户输入的1个蓝球号 21 int[] userRed = new int[6]; //用户输入的6个红球号 22 23 int blueball = 0; //正确的蓝球个数 24 int redball = 0; //正确的红球个数 25 26 Randomr = newRandom(); //随机函数 27 Scannerinput = newScanner(System.in);//键盘输入 28 29 //红球所有的33个号 30 int[] redNum ={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32}; 31 32 //系统随机在1-16中生成蓝球号 33 sysBlue= r.nextInt(16)+1; 34 35 //随机生成的红球号码 36 for (int i = 0; i < sysRed.length; i++) { 37 while(true){ 38 int index = r.nextInt(33); //随机生成0-32的下标 39 if (redNum[index] != 0) { 40 sysRed= redNum[index]; 41 redNum[index]= 0; 42 break; 43 } 44 } 45 } 46 47 System.out.println("双色球彩票选号开始啦~"); 48 System.out.println("请选择篮球号码(16选1):"); 49 userBlue= input.nextInt(); 50 System.out.println("请选择红球号码(33选6):"); 51 for (int i = 0; i < userRed.length; i++) { 52 userRed= input.nextInt(); 53 } 54 55 //验证篮球和红球的正确个数 56 //---------验证篮球 57 if (userBlue == sysBlue) { 58 blueball= 1; 59 } 60 61 //---------验证红球 62 for (int i = 0; i < userRed.length; i++) { 63 for (int j = 0; j < sysRed.length; j++) { 64 if (userRed ==sysRed[j]) { 65 redball++; 66 break; 67 } 68 } 69 } 70 71 //判断是否中奖 72 if (blueball == 1&& redball == 6) { 73 System.out.println("恭喜你,中了一等奖500万!"); 74 }else if(redball == 6){ 75 System.out.println("恭喜你,中了二等奖"); 76 }else if(blueball == 1&& redball == 5){ 77 System.out.println("恭喜你,中了三等奖,3000元"); 78 }else if(redball == 5 ||(blueball == 1 && redball == 4)){ 79 System.out.println("恭喜你,中了四等奖,200元"); 80 }else if(redball == 4 ||(blueball == 1 && redball == 3)){ 81 System.out.println("恭喜你,中了五等奖,10元"); 82 }else if(blueball == 1){ 83 System.out.println("恭喜你,中了六等奖,5元"); 84 }else{ 85 System.out.println("很遗憾,您没有中奖~~继续加油~~╮(╯▽╰)╭"); 86 } 87 88 //公布本期中奖号码 89 int temp; 90 for (int i = 0; i < sysRed.length-1; i++) { 91 for (int j = 0; j < sysRed.length-1-i; j++) { 92 if (sysRed[j] >sysRed[j+1]) { 93 temp= sysRed[j]; 94 sysRed[j]= sysRed[j+1]; 95 sysRed[j+1] = temp; 96 } 97 } 98 } 99 100 System.out.println("本期的中奖号码为:"); 101 System.out.println("红球:"); 102 for (int i = 0; i < sysRed.length; i++) { 103 System.out.println(sysRed+" "); 104 } 105 System.out.println(); 106 System.out.print("篮球:" + sysBlue); 107 108 } 109