【史上最强JavaSE笔记】之数组篇

 各位程序猿,各位攻城狮,各位蜥蜴鸥以及各位棕鲸鲤们~~大家好,我是潘师傅,欢迎大家收看由我为你们带来的【史上最强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  

 

你可能感兴趣的:(JavaSE)