零基础学习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即可得到代码运行后的结果

 

posted @ 2019-08-07 00:34  一y样  阅读(284)  评论(0编辑  收藏  举报