zoukankan      html  css  js  c++  java
  • 零基础学习java------day6----数组

    0. 内容概览

                                                   补充:main方法中的数组

    1. 数组的概述

    概念:

       用来存储一组相同数据类型的集合(或者叫容器)

     注意事项:

       1. 数组中的元素类型必须一致

       2. 数组本身是引用数据类型,但是里面的元素既可以是基本数据类型,也可以是引用数据类型

       3. 数组的长度一旦给定就无法改变

    声明

      (1)数据类型[]  数组名   (2)数据类型  数组名[]

    备注:main方法中只有两个地方可以改变,即中括号的位置和args的名字

    2 . 数组的初始化  

    2.1 动态初始化

    给定数组的长度,有系统分配空间和初始值

    格式:

       数据类型[ ]  数组名 = new 数据类型[数组的长度];

    如: int[]  arr = new int[5];

    数组的赋值和取值:

      索引: 索引是从0 开始的,索引的最大值是数组的长度减1

      赋值: 数组名[索引值] = 要赋的值
      取值: 数组名[索引值];

    案例: 创建一个长度为4的int 数组,并赋值 

    package com._51doit.javase.day06;
    
    public class ArrayDemoTest {
        public static void main(String[] args) {
            int[] arr = new int[4] ;//声明
            //System.out.println(arr);//局部变量不赋初值不能使用
            //赋值: 数组名[索引值] = 要赋的值
            //取值: 数组名[索引值];
            arr[0] = 100;
            arr[1] = 20;
            arr[2] = 89;
            arr[3] = 1000;
            for(int i=0;i<=3;i++) {
                System.out.println(arr[i]);
            }
        }
    }

    练习

    1. 创建一个String类型长度为4的数组,输入张三,李四,王二,麻子并分别将其名字存到该数组中

    package com._51doit.javase.day06;
    
    import java.util.Scanner;
    
    public class ArrayDemo1 {
        public static void main(String[] args) {
            String[] names = new String[5];        
            for(int i=0;i<names.length;i++) {
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入第"+(i+1)+"个名字");
                String name = sc.nextLine();
                names[i] = name;
            }
            for(int i=0;i<names.length;i++) {
                System.out.println(names[i]);
            }
        }
    }

    2. 创建一个char 类型的数组,把'多' '易' 教育分别存进去

    public class ArrayTest {
        public static void main(String[] args) {
            char[] arr = new char[4];
            arr[0] = '多';
            arr[1] = '易';
            arr[2] = '教';
            arr[3] = '育';  
        }
    }

    2.2数组的静态初始化

     概念:

      给定数组中的元素,由系统分配长度并赋值

    格式:

       数据类型[ ]  数组名 =  new 数据类型[ ]{元素1,元素2.....};

    简写格式

      数据类型[ ] 数组名 = {元素1,元素2.......}

    注意事项:

       只有第一次定义的时候可以简写,重写赋值的时候不能简写

     数组长度的获取:数组名.length

    public class ArrayDemo5 {
        public static void main(String[] args) {
            int[] arr = new int[] {1,2,3,4,5,6,7,8};
            System.out.println(arr.length);//8
            System.out.println(arr[7]);
            String[] arr1 = {"中","发","白"};
            //arr1 = {"梅","蓝"};//重写赋值不能简写
            arr1 = new String[]{"梅","蓝"};
            for(int i=0;i<=arr.length-1;i++) {
                System.out.println(arr[i]);//0-7
            }
        }
    }    

    练习

    1. 创建一个char数组:多易教育,然后遍历

    package com._51doit.javase.day06;
    
    public class PracticeDemo1 {
        public static void main(String[] args) {
            char[] arr1 = new char[] {'多','易','教','育'};
            for(int i=0;i<arr1.length;i++) {
                System.out.print(arr1[i]);
            }
        }
    
    }

    2. 创建int 数组,存入5 个元素,求该数组的元素之和, 平均值

    package com._51doit.javase.day06;
    
    public class PracticeDemo1 {
        public static void main(String[] args) {
            char[] arr1 = new char[] 
            int[] arr2 = new int[] {12,11,33,44};
            int sum = 0;
            double aver;
            for(int i=0;i<arr2.length;i++) {
                sum += arr2[i];
            }
            aver = (double)sum/arr2.length;
            System.out.println("元素之和为:"+sum);
            System.out.println("平均值为:"+aver);
        }
    }

     3. 数组的内存分析

    栈(stack):

      存放局部变量和方法名,没有初始值

    堆(heap):

      存放new出来的东西(如,new int[1,2,3,4]),有初始值(基本数据类型:默认值;引用数据类型:null)

    如果堆中内存没有栈中变量指向时(python中指的是引用计数为0,此处不知),就会成为垃圾,等待GC自动回收

     如图

     

    注意  打印arr时,得到的是一个编号(图中是[I@7852e922, "["表示以为数组,I表示int类型,7852e922则表示存储地址)

     当main方法执行完时,main方法就从栈中弹出去了,也就是说arr没了(就没有指向堆的指针了),所以对重的数据就被当垃圾回收掉了,如下

    当初始化多个数组时,如将第二个数组赋值给第一个数组(如下图,令arr=arr1),此时数组指向的地址就会发生改变,此处的arr指向由ox0001变为0x0002

    4. 数组常见异常

     空指针异常

       产生的原因: 使用null 调用堆中的内容,要注意的是,如果一个变量的初始值是null,直接打印是不报错的,只有调用他里面的东西才会报空指针

     案例:

    int [] arr = null;//有初始值,初始值为null
    System.out.println(arr); //null
    System.out.println(arr[0]);// java.lang.NullPointerException

    这里能解释前面比较字符串相等出现的equals,其形式为:字符串a.equals(字符串b),若将未知字符串放在a位置,若未知字符串是空,则会报空指针异常错误,但将已知的字符串放a位置就不会出现这种情况

     数组角标越界异常:

      产生的原因:数组的索引值超出的最大的范围,就会出现该异常

    案例: 

    int[] arr = new int[3];// 索引值0-2
    System.out.println(arr[4]);// java.lang.ArrayIndexOutOfBoundsException

      

     5. 数组案例

    5.1 点名系统

    从全班同学的名字中随机挑选一个:

    分析步骤:
    1. 构建一个String 类型的数组,用来存储全班同学的名字
    2. 需要生成一个随机数,作为索引值,

    Random(java.util)
    Random r = new Random();
    int a = r.nextInt(20);//生成[0-20) 之间的随机数

    3. 根据索引值从数组中取元素

    package com._51doit.javase.day06;
    
    import java.util.Random;
    
    public class CallName {
        public static void main(String[] args) {
         // 1. 构建一个全班同学名字的数组 String[] names
    = new String[] {"张三","李四","王二","麻子","小红","小明","小强","老王"};
         // 2. 生成随机索引 Random r
    = new Random(); int index = r.nextInt(8);
         //3. 根据随机数从数组中获取元素 String name
    = names[index]; System.out.println("有请"+name+"同学发言"); } }

    5.2 数组的遍历 

    案例:定义一个数组{1,2,3,4,5},按如下格式打印数据[1,2,3,4,5]

    分析: 1. 对数组做遍历
    2. 如果是第一个元素:打印” [元素, ”
    3. 最后一个元素: 元素]
    4.其余元素: 元素,

    package com._51doit.javase.day06;
    
    public class ArrayDemo2 {
        public static void main(String[] args){
            int[] arr = {1,2,3,4,5};
    //1. 对数组做遍历 for(int i=0;i<arr.length;i++) { //对一个元素的数组做单独处理 if(arr.length == 1) { System.out.println("["+arr[0]+"]"); } //2. 如果是第一个元素:打印[元素, else if(i == 0) { System.out.print("["+arr[i]+",");//注意不换行 }else if(i==arr.length-1) { //3. 最后一个元素: 元素] System.out.println(arr[i]+"]");//可以换行 }else { //4.其余元素: 元素, System.out.print(arr[i]+",");//不换行 } } } }

    封装成方法:

        public static void printArr(int[] arr) {
            //1. 对数组做遍历
            for(int i=0;i<arr.length;i++) {
                //对一个元素的数组做单独处理
                if(arr.length == 1) {
                    System.out.println("["+arr[0]+"]");
                }
                //2. 如果是第一个元素:打印[元素,
                else if(i == 0) {
                    System.out.print("["+arr[i]+",");//注意不换行
                }else if(i==arr.length-1) {
                    //3. 最后一个元素: 元素]
                    System.out.println(arr[i]+"]");//可以换行
                }else {
                    //4.其余元素: 元素,
                    System.out.print(arr[i]+",");//不换行
                }
            }
        }

    在main方法中调用:

    public static void main(String[] args){
        int[] arr = {1,2,3,4,5,6};
            printArr(arr);
    }

    5.3  工具类的封装

    1.在我们的项目中创建一个util的包,并在在包下创建一个类:ArrayUtil

    在类中建方法:

    package com._51doit.javase.util;
    
    public class ArrayUtil {
        // 打印数组
        public static void printArr(int[] arr) {
            //1. 对数组做遍历
            for(int i=0;i<arr.length;i++) {
                //对一个元素的数组做单独处理
                if(arr.length == 1) {
                    System.out.println("["+arr[0]+"]");
                }
                //2. 如果是第一个元素:打印[元素,
                else if(i == 0) {
                    System.out.print("["+arr[i]+",");//注意不换行
                }else if(i==arr.length-1) {
                    //3. 最后一个元素: 元素]
                    System.out.println(arr[i]+"]");//可以换行
                }else {
                    //4.其余元素: 元素,
                    System.out.print(arr[i]+",");//不换行
                }
            }
        }
    }

    调用

    public class ArrayDemo2 {
        public static void main(String[] args){
            int[] arr = {1,2,3,4,5,6};
                    ArrayUtil.printArr(arr);
    }

    5.4 最值

    最值:最大值和最小值

    案列:数组{1,2,3,4,5,6} 打印最大值和最小值

    思路: 1. 设置一个变量用来代表最值(数组中的第一个元素)
        2. 用这个变量和数组中的每一个元素作比较
        3. 如果数组中有元素比他大,就把他的值重新赋值
        4. 比较结束后,打印最值

    package com._51doit.javase.day06;
    
    public class PrintMaxAndMinValue {
        public static void main(String[] args) {
            int[] arr1 = new int[] {1,2,3,4,5,6};
            printMaxAndMin(arr1);
        }
        public static inr[] getMaxAndMin(int[] arr) {
            int max = arr[0];
            int min = arr[0];
            
            for(int i=0;i<arr.length;i++) {
                if(arr[i]>max) {
                    max = arr[i];
                }
                if(arr[i]<min) {
                    min = arr[i];
                }
            }
            //System.out.println(max);
            //System.out.println(min);
         int[] result = {max,min}
         return result;
    } }

    封装方法

        public static int[] getMaxAndMin(int[] arr) {
            int max = arr[0];
            int min = arr[0];
            
            for(int i=0;i<arr.length;i++) {
                if(arr[i]>max) {
                    max = arr[i];
                }
                if(arr[i]<min) {
                    min = arr[i];
                }
            }
            int[] result = {max, min};
            return result;
        }

    调用

        public static void main(String[] args) {
            int[] arr1 = new int[] {1,2,3,4,5,6};
            ArrayUtil.getMaxAndMin(arr1);

    5.5 数组元素索引的查找

    案例

    查找数组[1,2,3,4,5,6]中数值为5的索引

    封装方法

        public static int index(int[] arr,int num) {
            int location = -1;
            for(int i=0;i<arr.length;i++) {
                if(arr[i] == num) {
                    location = i;
                    break;
                }
            }
            System.out.println(location);
            return location;
        }

    调用

        public static void main(String[] args) {
            int[] arr1 = new int[] {1,2,3,4,5,6};
            int num=5;
            ArrayUtil.index(arr1,num); //得到结果为4

    5.6 元素交换

    如何将数组中的两个元素做交换
    举例: 将一杯雪碧和一杯可乐做交换:
      思路:要引入一个空杯.,先把雪碧倒入空杯,把可乐倒入雪碧杯,再把空杯中的可乐倒入空杯

    int temp = arr[0];//第一个元素进空杯
    arr[0] = arr[1];//第二个元素进第一个元素被
    arr[1] = temp;//空杯中倒入第二个被
    //创建一个方法,交换数组中的两个元素:
    public static void swap(int[]arr,int x,int y) {
        int temp = arr[x];
        arr[x] = arr[y];
        arr[y] =temp;
    }

    5.7 逆序
    大致流程如下图,第一个数和最后一个数换,第二个数与倒数第二个数换,以此类推。。。。。

    封装方法

        // 数组的反转
        public static void reverse(int[] arr) {
            for(int i=0;i<arr.length/2;i++) {
                int temp = arr[i];
                arr[i] = arr[arr.length-1-i];
                arr[arr.length-1-i] = temp;
            }
        }

    调用

    public class Reverse {
        public static void main(String[] args) {
            int[] arr1 = new int[] {1,2,3,4,5,6};
            ArrayUtil.printArr(arr1);
            ArrayUtil.reverse(arr1);
            ArrayUtil.printArr(arr1);
        }

    运行结果如下

    6. 多维数组

    1 数据类型[ ][ ]  数组名 = new 数据类型[m][n];
      m: 二维数组中一维数组的个数
      n: 一维数组中元素的个数
    2  数据类型[][] 数组名= new 数据类型[m][];
      m:二维数组中一维数组的个数
    3. 数据类型[][] 数组名= new  数据类型[][]{{元素值,元素值...},{元素值,元素值...},{元素值,
    元素值,...}};
    简写: = {{元素值,元素值...},{元素值,元素值...},{元素值,元素值,...}};

      
    第一种类型案例

    package com._51doit.javase.day06;
    
    public class MultiDArrayDemo {
        public static void main(String[] args) {
            int[][] arr = new int[4][5];
            System.out.println(arr[1][3]); // 打印的是第二个数组中的低是个元素
        }
    }

    这种类型只能表示元素数相同的数组(二元数组中的数组),为了解决这个问题,类型二就很有必要了

    第二种类型

    int[][] arr1 = new int[3][];
    arr1[0] = new int[] {1,2,3,4,5};
    arr1[1] = new int[] {1,2};
    arr1[2] = new int[]{7,8,9,9,2}

    注意:给二维数组赋值时,不能简写,如下面写法就是错误的

    arr1[2]= {3,4}; //给二维数组中一维数组赋值的时候,不能简写

    但如上面这样数组一个一个的定义比较麻烦,这时候3的形式就比较重要了(下面代码相当于上面第二种类型的效果)

    int[][] arr1 = new int[][] {{1,2,3,4,5},{1,2},{7,8,9,9,2}};

    7. main方法中的数组

    main方法中的数组是用来接收键盘录入的参数的(即可以在终端命令行输入参数)

    用法:

      javac 命令不变

      java命令 后面跟参数,多个参数用空格隔开

      如:java HelloWorld a b c d

      a b c d就自动装入args数组里了

    案例

    package com._51doit.javase.day06;
    
    public class ArrayTest {
        public static void main(String[] args) {
            for(int i=0;i<args.length;i++) {
                System.out.print(args[i]);
            }
        }    
    }

    在终端命令行运行的话,直接编译,即javac ArrayTest.java=======>java ArrayTest  1 2 3即可遍历得到数组args的元素分别为1 ,2, 3

    若在eclipse上运行的话,run as===>选择run configurations=====>找到要运行的类(如此处是ArrayTest)====>点击Arguments===>输入自己的参数,如下图

     应用后,点击run即可得到代码运行后的结果

  • 相关阅读:
    JAVA应用apache httpclient探测http服务
    C#中字符串与byte[]相互转换
    C#中位、字节等知识
    #JAVA操作LDAP
    C#正则表达式判断字符串是否是金钱
    【IDEA】使用Maven骨架创建JavaWeb项目
    【IDEA】回退操作记录
    【SpringMVC】IDEA 不识别webapp的解决办法
    【Layui】16 表单元素 Form
    【Layui】15 日期时间选择器 Laydate
  • 原文地址:https://www.cnblogs.com/jj1106/p/11312745.html
Copyright © 2011-2022 走看看