Day04

Day04

数组

1、认识数组

  • 数组就是一个容器,用来存储相同类型的数据(元素)

  • int[] arr = {20,10,30,20}
    String[] name = {"小米","小兰","小孩"}
    
  • 为什么有字符串类型的变量,还要数组

    • 减少代码,使得代码整洁,清晰

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RdKlond2-1668420496815)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221113110738296.png)]

2、数组的定义和访问

1.静态初始化数组
  • 静态初始化数组:就是定义数组的时候直接给数组元素赋值

  • 格式:

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

    简化格式:推荐

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

    • “数据类型[] 数组名” 也可以写成 “数据类型 数组名[]”,但不建议
    • 什么类型的数组只能存放什么类型的数据
    • 数组既可以存储基本数据类型,也可以存储引用数据类型
  • 数组在计算机的基本原理

    • 数组变量存储的是数组在内存中的地址,数组是一种引用数据类型

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vDWvx5Fk-1668420496816)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221113160129649.png)]

package com.itheima.define;

public class Demo {
    public static void main(String[] args) {
        //数组的定义:静态初始化数组
        //数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,...}
        int[] ages = new int[]{24,25,20,23,27,27};
        double[] height = new double[]{165.2,177,160,180,162.3};//为什么可以存储177,160呢?因为自动类型转换
        String[] names = new String[]{"就","成都","的"};

        // 简化: 数据类型[] 数组名 = {元素1,元素2,元素3,...}
        int[] ages1 = {24,25,20,23,27,27};
        double[] height2 = {165.2,177,160,180,162.3};
        String[] names2 = {"就","成都","的"};

//       1. “数据类型[] 数组名”也可写成 “数据类型 数组名[] ”。
        int ages3[] = {22,23,24};//c语言的写法,不建议

//       2. 什么类型的数组只能存放什么类型的数据。
       // int[] ages4 = {223,150.3,120};//报错

//        3.数组既可以存储基本数据类型的数据,也可以存储引用数据类型的数据
        int[] ages5 = {24,25,20,23,27,27};//基本数据类型
        double[] height5 = {165.2,177,160,180,162.3};//基本数据类型
        String[] names5 = {"就","成都","的"};//引用数据类型


        System.out.println(ages);//[I@776ec8df    [:表示数组  ,I:表示数组类型  @776ec8df:地址,十六进制,因为有英文
        System.out.println(height); // [D@4eec7777
        System.out.println(names);// [Ljava.lang.String;@3b07d329  [:表示数组  ,Ljava.lang.String:表示数组类型  @3b07d329:地址,十六进制,因为有英文
    }
}

数组的访问
  • 数组的访问

    数组名称[索引]
    
  • 数组的长度属性

    数组名称.length
    
  • 数组的最大索引

    数组名称.length-1
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HQ2vMqDW-1668420496817)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221113160645516.png)]

  • 当使用的索引超出数组最大索引时
    • 会报AarryIndexOutOfBoundsException,数组索引(下标)越界异常
package com.itheima.define;

public class Demo2 {
    public static void main(String[] args) {
        //数组的访问
        //1.访问数组中的元素
        int[] ages = {22, 18, 1, 24, 27, 26};
        //             0  1   2   3   4   5
        int age = ages[4];
        System.out.println(age);
        //2.给数组中的元素重新赋值
        ages[4] = 100;
        System.out.println(ages[4]);
        //3.访问数组的长度
        System.out.println(ages.length);
        //4.访问数组最大索引元素
        System.out.println(ages[ages.length - 1]);

        //5.报错,如果数组索引超过范围,会报错 :ArrayIndexOutOfBoundsException  数组索引越界异常
        System.out.println(ages[ages.length]);
        //数组中元素至少有一个
        int[] ages2 = {};
        System.out.println(ages2.length-1);
    }
}
数组的遍历
  • 遍历:就是一个一个的访问数据

  • 遍历的原因:求和,元素搜索,找最大值,最小值

  • for循环

    package com.itheima.define;
    
    public class Demo3 {
        public static void main(String[] args) {
            //数组元素的遍历
    
            int[] ages = {22, 18, 1, 24, 27, 26};
            for (int i = 0; i < ages.length; i++) {
                System.out.println(ages[i]);
            }
        }
    }
    
案例训练
  • 数组遍历求和

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ahsk8u0k-1668420496818)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221113173913818.png)]

  • 分析:

    • 把数据放到数组中,使用静态初始化定义数组
    • 使用for循环遍历数组元素,在循环外面定义求和变量,在循环内累加起来
    package com.itheima.define;
    
    public class Test1 {
        public static void main(String[] args) {
            //案例:计算销售总额
            int[] money = {16, 26, 36, 6, 100};
            int num = 0;
    
            for (int i = 0; i < money.length; i++) { //快捷键:money.fori
                num += money[i];
            }
            System.out.println("销售总额为:" + num);
        }
    }
    
2.动态初始化数组
  • 数组的动态初始化:

    • 定义数组时先不存入具体的元素值,只确定数组存储的数据类型和数组长度
  • 格式:

    数据类型[] 数组名 = new 数据类型[]
    int[] arr = new int[3]
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vr5x7rr5-1668420496819)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114165956146.png)]

    
    
    
  • 动态初始化数组的默认值规则:

    • byte,short,char,int,long:0
    • float,boolean:0.0
    • 引用数据类型:null
    package com.itheima.define;
    
    public class Demo5 {
        public static void main(String[] args) {
            //数组的定义:动态初始化数组
            //数据类型[] 数组名 = new 数据类型[数组长度]
            int[] arr  = new int[5];
            System.out.println(arr[3]);//0
            //赋值
            arr[3] = 100;
            System.out.println(arr[3]);//100
    
            //动态初始化数组中的元素为默认值
            //byte,short,char,int,long-------------->默认值:0
            byte[] arr1 = new byte[3];
            System.out.println(arr1[1]);//0
            short[] arr2 = new short[3];
            System.out.println(arr2[1]);//0
            char[] arr3 = new char[3];
            System.out.println(arr3[1]*1);//直接输出arr3[1],输出的是0的字符集编码,故*1,进行强制转换,结果为0,说明是0
            int[] arr4 = new int[3];
            System.out.println(arr4[1]);//0
            long[] arr5 = new long[3];
            System.out.println(arr5[1]);//0
    
            //float,double -----------------> 0.0
            double[] arr6 = new double[3];
            System.out.println(arr6[1]);//0.0
    
            //boolean---------->false
            boolean[] arr7 = new boolean[3];
            System.out.println(arr7[1]);//flase
    
            //引用数据类型 String ---------->  null
            String[] arr8 = new String[3];
            System.out.println(arr8[1]);//null
    
    
        }
    }
    
  • 静态和动态初始化各自适合什么业务场景

    • 动态:不确定具体元素,只知道元素的个数和数据类型
    • 静态:知道具体的元素
案例训练
  • 案例1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qJkGMdJp-1668420496819)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114172112541.png)]

package com.itheima.define;

import java.util.Scanner;

public class Test2 {
    public static void main(String[] args) {
        //案例:计算6位评委打分总和的平均数
        double[] scores = new double[6];

        Scanner scanner = new Scanner(System.in);


        //建议一个for循环做一个事情


        for (int i = 0; i < scores.length; i++) {
            System.out.println("请输入第" + (i + 1) + "位评委打分");
//            double score = scanner.nextDouble();
//            scores[i] = score;
            scores[i] = scanner.nextDouble();
        }

        double sum = 0;

        for (int i = 0; i < scores.length; i++) {
            sum += scores[i];
        }
        double result = sum / scores.length;
        System.out.println("最终结果为:" + result);
    }
}
  • 案例2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WjEQXWY2-1668420496820)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114172226793.png)]

package com.itheima.define;

public class Test3 {
    public static void main(String[] args) {
//     需求:某班级学生的Java考试成绩是:99, 100, 62, 15, 48, 65, 98, 99, 5, 59.5, 75; 请统计班级总人数和及格学生总人数。
        double[] scores = {99, 100, 65, 15, 48, 65, 98, 99, 5, 59.5, 75};
        System.out.println("班级总人数:" + scores.length);

        int student = 0;

        for (int i = 0; i < scores.length; i++) {
            if (scores[i] >= 60) {
                student++;
            }
        }
        System.out.println("及格学生总人数:" + student);
    }
}

3、数组在计算机中的执行机制

1.Java内存分配,数组在内存中的执行原理
  • 运行一个Java程序,主要看JVM包含的以下内存区域
    • 方法区
    • 栈内存(基本数据变量都在栈内存)
    • 堆内存
  • 简单说说 int a = 20; int[] arr = new int[3]这两行代码的执行原理?
    • a是变量,直接放在栈内存,a变量存储的数据就是20这个值
    • new出来的数组对象放在堆内存开辟区域存储三个整数,并且有自己的地址信息
    • arr是数组变量,直接放在栈内存,内部存储的为数组对象的地址信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TrwT1Enb-1668420496821)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114172647506.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPA3Z7Y5-1668420496821)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114172706897.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3zhWU29q-1668420496822)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114172735625.png)]

多个变量指向同一个数组的问题
  • 多个变量指向同一个数组对象,它们内部存储的地址信息是一样的,
  • 多个变量修改的是同一个数组对象中的变量,当其中一个变量对数组进行操作改变数组元素,会影响其他变量
  • 如果变量里的存储的是null,那么就不再指向任何对象,此时打印数组名结果是:null,打印数组元素以及数组长度会报空指针异常:NullPonitException

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dPLARfQ4-1668420496823)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114174057347.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iEO4OSkW-1668420496823)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114174124868.png)]

4、专项训练:数组常见的案例

1.求数组中的最大值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sZzDVI35-1668420496823)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114174302370.png)]

package com.itheima.Demo;

public class Test1 {
    public static void main(String[] args) {
        //求数组中元素的最大值
        //1.将数据放入到数组中
        int[] faceScore = {15,9000,10000,20000,9500,-5};

        //2.设置一个临时最大值,默认使用数据第一个元素 ,如果用0的话,数组中有负数将不正确
        int max = faceScore[0];
        //3.遍历,比较,遍历出的数据,如果大于临时最大值,就替换
        for (int i = 1; i < faceScore.length; i++) {//int i = 1,没有必要第一个元素与自己再比一次
            if (faceScore[i]>max){
                max = faceScore[i];
            }
        }
        System.out.println("最大结果:"+max);
    }
}
2.数组反转

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gC8w3Jpi-1668420496824)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114174450300.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EjeziKUp-1668420496824)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114174514452.png)]

package com.itheima.Demo;

public class Test2 {
    public static void main(String[] args) {
        //案例:某个数组有5个数据:10,20,30,40,50,请将这个数组中的数据进行反转。
        //      [10, 20, 30, 40, 50]  反转后 [50, 40, 30, 20, 10]
        //1.定义数组
        int[] arr = {10,20,30,40,50};

        // 10 20 30 40  50
        //  0  1  2  3  4
        //  i           j
        //arr[0]与arr[4]交换,arr[1]与arr[3]交换,arr[2]不动
        //for循环,定义两个初始值变量,让两个变量代表的元素交换,首先是0,4
        for (int i = 0 , j = arr.length-1; i < j ; i++,j--) {//循环条件:当arr[i]与arr[j]相遇交换结束,相遇时又不用进行交换,因此i<j
            //留着交换需要定义一个临时变量
          int temp =  arr[j];
          arr[j] = arr[i];
          arr[i] = temp;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }

    }
}
随机排名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zIBgXN1F-1668420496825)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114174644732.png)]

package com.itheima.Demo;

import java.util.Random;
import java.util.Scanner;

public class Test3 {
    public static void main(String[] args) {
        //需求
        //某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。
        //定义动态数组
        int[] arr = new int[5];

        //将动态数组的每个位置元素录入
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < arr.length; i++) {
            System.out.println("请输入第"+(i+1)+"名开发人员");
            arr[i] = scanner.nextInt();
        }

        //遍历数组,随机拿到索引与之交换
        Random r = new Random();
        for (int i = 0; i < arr.length; i++) {
           int index =  r.nextInt(arr.length);//我们需要随机的索引范围为[0,4],故这里写5也就是数组长度
           int temp = arr[index];
           arr[index] = arr[i];
           arr[i] = temp;
        }
        System.out.println("随机排名后的顺序:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }
    }
}

5、Debug工具的使用

 }

    //遍历数组,随机拿到索引与之交换
    Random r = new Random();
    for (int i = 0; i < arr.length; i++) {
       int index =  r.nextInt(arr.length);//我们需要随机的索引范围为[0,4],故这里写5也就是数组长度
       int temp = arr[index];
       arr[index] = arr[i];
       arr[i] = temp;
    }
    System.out.println("随机排名后的顺序:");
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i]+"\t");
    }
}

}




### 5、Debug工具的使用



[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-98XSUI6d-1668420496825)(C:\Users\王超越\AppData\Roaming\Typora\typora-user-images\image-20221114180747128.png)]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值