Java-数组

目录

一、数组概述

二、数组的定义

1.静态初始化数组

1.1数组的访问

1.2数组的几个注意事项

2.动态初始化数组

2.1动态初始化数组的元素默认值

三、数组的遍历

四、数组的案例

1.数组元素求和

2.数组求最值

3.猜数字游戏

4.随机排名

5.数组排序

五、数组的内存图

1.Java内存分配、数组内存图

2.两个变量指向同一个数组

六、数组使用的常见问题

七、Debug工具的使用


一、数组概述

数组的定义:数组就是用来存储一批同种类型数据的内存区域(可以理解为容器)

结论:数组适合做一批同种类型数据的存储

二、数组的定义

1.静态初始化数组

定义数组的时候直接给数组赋值

静态数组初始化完整格式:数据类型[ ] 数组名 = new 数据类型[ ]{元素1,元素2,元素3...};

静态数组初始化简化格式:数据类型[ ] 数组名 = {元素1,元素2,元素3...};

package com.pikaqiu.create;

public class ArrayDemo1 {
    public static void main(String[] args) {
        //完整格式: 数据类型[ ] 数组名 = new 数据类型[ ]{元素1,元素2,元素3...};
        //double[] scores = new double[] {99.5,88.0,75.5};
        //简化格式: 数据类型[ ] 数组名 = {元素1,元素2,元素3...};
        double[] scores = {99.5,88.0,75.5};

        //int[] ages = new int[] {12,21,33};
        int[] ages = {12,21,33};

        //String[] names = new String[] {"张三","李四","王五"};
        String[] names = {"张三","李四","王五"};

        //打印数组的首地址
        System.out.println(scores);
    }
}

1.1数组的访问

格式:数组名称[索引]

数组的长度属性: length

package com.pikaqiu.create;

public class ArrayDemo2 {
    public static void main(String[] args) {
        //定义一个数组
        int[] ages = {12,24,36};

        //取值: 数组名称[索引]
        System.out.println(ages[0]);
        System.out.println(ages[1]);
        System.out.println(ages[2]);

        System.out.println("-------------------------");
        //赋值: 数组名称[索引] = 数据;
        ages[2] = 100;
        System.out.println(ages[2]);

        System.out.println("-------------------------");
        //访问数组的长度
        System.out.println(ages.length);

        System.out.println("-------------------------");
        //数组的最大索引 数组名.length - 1 (前提:元素个数大于0)
        System.out.println(ages.length-1);
    }
}

1.2数组的几个注意事项

1."数据类型[ ] 数组名" 也可以写成 "数据类型 数组名[ ]"

2.什么类型的数组必须存放什么类型的数据,否则会报错

3.数组一旦定义出来后,类型和长度就固定了

package com.pikaqiu.create;

public class ArrayDemo3 {
    public static void main(String[] args) {
        //数组的注意事项
        //1."数据类型[ ] 数组名" 也可以写成 "数据类型 数组名[ ]"
        int[] ages = {10,20,30};
        //int ages1[] = {10,20,30};

        //2.什么类型的数组必须存放什么类型的数据,否则会报错
        //String[] names = {"张三","李四",23}; //错误的

        //3.数组一旦定义出来后,类型和长度就固定了
        int ages2[] = {10,20,30};
        //System.out.println(ages2[3]); //报错,长度固定为3,无法访问第四个元素
    }
}

2.动态初始化数组

定义数组的时候只确定元素的类型和数组的长度,之后再存入具体的数据

数组的动态初始化格式:数据类型[ ] 数组名 = new 数据类型[长度];

静态初始化数组和动态初始化数组的区别:当前已经知道存入的元素值,用静态初始化;当前还不清楚要存入那些数据,用动态初始化

package com.pikaqiu.create;

public class ArrayDemo4 {
    public static void main(String[] args) {
        //定义动态数组
        //格式: 数据类型[ ] 数组名 = new 数据类型[长度];
        double[] scores = new double[3]; //默认值[0.0,0.0,0.0]

        //赋值
        scores[0] = 99.5;
        System.out.println(scores[0]); //99.5

        System.out.println(scores[2]); //0.0

        System.out.println("--------------------");
        String[] names = new String[90]; //引用类型的默认值是null
        names[0] = "皮卡丘";
        names[2] = "妙蛙种子";
        System.out.println(names[0]); //皮卡丘
        System.out.println(names[1]); //null
        System.out.println(names[2]); //妙蛙种子
    }
}

2.1动态初始化数组的元素默认值

两种初始化的使用场景总结、注意事项说明:1.动态初始化:只指定数组长度,后期赋值,适合开始知道数据的数量,但不确定具体元素值的业务场景;2.开始就存入元素值,适合一开始就确定元素值的业务场景;3.两种格式的写法是独立的,不可以混用

package com.pikaqiu.create;

public class ArrayDemo5 {
    public static void main(String[] args) {
        //1.整型数组的元素默认值都是0
        int[] arr = new int[10];
        System.out.println(arr[0]); //0
        System.out.println(arr[9]); //0

        System.out.println("--------------------");
        //2.字符数组的元素默认值也是0
        char[] ch = new char[100];
        System.out.println((int)ch[0]); //0
        System.out.println((int)ch[99]); //0

        System.out.println("--------------------");
        //3.浮点型数组的元素默认值是0.0
        double[] scores = new double[80];
        System.out.println(scores[0]); //0.0
        System.out.println(scores[79]); //0.0

        System.out.println("--------------------");
        //4.布尔类型的数组元素默认值是false
        boolean[] rs = new boolean[100];
        System.out.println(rs[0]); //false
        System.out.println(rs[99]); //false

        System.out.println("--------------------");
        //引用类型的数组元素默认值是null
        String[] names = new String[50];
        System.out.println(names[0]); //null
        System.out.println(names[49]); //null
    }
}

三、数组的遍历

遍历:就是一个一个数据的访问

遍历的作用:搜索、数据统计等等都要用到遍历

package com.pikaqiu.traverse;

public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr = {12,24,12,48,98};

        //原始遍历方式
//        System.out.print(arr[0] + " ");
//        System.out.print(arr[1] + " ");
//        System.out.print(arr[2] + " ");
//        System.out.print(arr[3] + " ");
//        System.out.print(arr[4] + " ");
//        System.out.println(); //换行

        System.out.println("--------------------");
        //采用循环的方法
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

四、数组的案例

1.数组元素求和

需求:某部门5名员工的销售额分别是:16、26、36、6、100,请计算他们部门的总销售额

package com.pikaqiu.demo;

public class Demo1 {
    public static void main(String[] args) {
        //1.用数组存放数据
        int[] money = {16,26,36,6,100};
        
        //2.遍历数组并求和
        int sum = 0;
        for(int i = 0;i < money.length;i++){
            sum += money[i];
        }
        System.out.println("总销售额为: " + sum);
    }
}

2.数组求最值

package com.pikaqiu.demo;

public class Demo2 {
    public static void main(String[] args) {
        int[] scores = {15,90,100,200,95,5};

        int max = scores[0];
        for (int i = 1; i < scores.length; i++) {
            if(max < scores[i]){
                max = scores[i];
            }
        }
        System.out.println("这组元素中的最大值为:" + max);
    }
}

3.猜数字游戏

需求:游戏后台随机生成1-20之间的5个数(无所谓是否重复),然后让大家来猜数字:未猜中提示:未命中,并继续猜测;猜中提示:"猜中了",并输出该数据第一次出现的位置,且输出全部5个数据,最终结束游戏

package com.pikaqiu.demo;

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

public class Dmeo3 {
    public static void main(String[] args) {
        //1.获取5个随机数
        int[] luckNumber = new int[5];
        Random r = new Random();
        for (int i = 0;i < luckNumber.length;i++) {
            luckNumber[i] = r.nextInt(20) + 1;
        }

        //2.利用死循环让大家猜数字,直到猜对
        Scanner sc = new Scanner(System.in);
        OUT:
        while(true){
            System.out.println("请输入您猜测的数字(1-20):");
            int number = sc.nextInt();

            for (int i = 0; i < luckNumber.length; i++) {
                if(number == luckNumber[i]){
                    System.out.println("恭喜你,猜对了!" + "该数字首次出现的位置是:" + (i+1));
                    break OUT; //结束这个死循环,代表游戏结束
                }
            }
            System.out.println("未猜对,请重新猜测");
        }

        System.out.println("--------------------------");
        //打印这五个随机数
        System.out.println("这五个幸运数字为:");
        for (int k = 0; k < luckNumber.length; k++) {
            System.out.print(luckNumber[k] + " ");
        }
        System.out.println(); // 换行

    }
}

4.随机排名

需求:某公司开发部5名开发人员,要演讲,现在采取随机排名后进行汇报,请先依次录入员工的工号,然后展示出一组随机的排名顺序

import java.util.Scanner;

public class Demo4 {
    public static void main(String[] args) {
        //1.动态初始化一个数组,存储5个工号
        int[] codes = new int[5];

        //2.使用循环,录入工号
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < codes.length; i++) {
            System.out.println("请输入第" + (i+1) + "员工的工号:");
            int code = sc.nextInt();
            //将数据放到数组中
            codes[i] = code;
        }

        //3.遍历数组中的每个元素,然后随机一个索引,让元素与随机索引处的元素进行交换
        Random r = new Random();
        for (int i = 0; i < codes.length; i++) {
            //随机一个索引位置出来
            int index = r.nextInt(codes.length);
            int temp = codes[index];
            codes[index] = codes[i];
            codes[i] = temp;
        }

        //4.打印最后的顺序
        System.out.println("员工演讲顺序为:");
        for (int i = 0; i < codes.length; i++) {
            System.out.print(codes[i] + " ");
        }
        System.out.println(); //换行
    }
}

5.数组排序

需求:用冒泡排序的方法对一个数组排序

package com.pikaqiu.demo;

import java.util.Scanner;

public class Demo5 {
    public static void main(String[] args) {
        //1.定义一个动态数组
        int[] number = new int[10];

        //2.利用循环得到10个数
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < number.length; i++) {
            System.out.println("请输入第" + (i+1) + "个数:");
            int data = sc.nextInt();
            number[i] = data;
        }

        //3.利用冒泡排序对数组进行排序
        for (int i = 0; i < number.length - 1; i++) {
            for(int j = 0; j < number.length - i -1; j++){
                if(number[j] > number[j+1]){
                    int temp = number[j+1];
                    number[j+1] = number[j];
                    number[j] = temp;
                }
            }
        }

        //4.打印输出最后排序的结果
        System.out.println("最后排序的结果为:");
        for (int i = 0; i < number.length; i++) {
            System.out.print(number[i] + " ");
        }
    }
}

五、数组的内存图

1.Java内存分配、数组内存图

栈:方法运行时所进入的内存,变量也是在这里

堆:new出来的东西会在这块内存中开辟空间并产生地址

方法区:字节码文件加载时进入的内存

本地方法栈

寄存器

package com.pikaqiu.memory;

public class ArrayDemo1 {
    public static void main(String[] args) {
        int a = 15;
        System.out.println(a); //输出数据本身

        int[] arr = new int[]{10,20,30};
        System.out.println(arr); //输出数组首地址

        arr[0] = 40;
        arr[1] = 50;
        arr[2] = 60;
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}

2.两个变量指向同一个数组

package com.pikaqiu.memory;

public class ArrayDemo2 {
    public static void main(String[] args) {
        int[] arr1 = {11,22,33};

        //把数组arr1变量赋值给int类型的数组变量arr2
        int[] arr2 = arr1; //此时arr1和arr2地址一样

        System.out.println(arr1);
        System.out.println(arr2);

        arr2[1] = 99;
        System.out.println(arr1[1]); //99

        System.out.println(arr2[0]); //11
        System.out.println(arr2[1]); //99
        System.out.println(arr2[2]); //33
    }
}

六、数组使用的常见问题

1.如果访问的元素超过最大索引,执行时会出现数组索引越界异常

2.如果数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现空指针异常

package com.pikaqiu.attention;

public class Test1 {
    public static void main(String[] args) {
        //问题1:如果访问的元素超过最大索引,执行时会出现数组索引越界异常
        int[] arr = {10,20,30};
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        //System.out.println(arr[3]); //超过最大索引,程序出现异常
        //System.out.println("程序结束~~~");

        System.out.println("--------------------");
        //问题2:如果数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现空指针异常
        arr = null;
        System.out.println(arr);
        //System.out.println(arr.length); //空指针异常
        //System.out.println(arr[0]); //空指针异常 
        System.out.println("程序结束~~~");
    }
}

七、Debug工具的使用

Debug工具:IDEA自带的断点调试(排错)工具,可以控制代码从断点开始一行一行的执行,然后详细观看程序执行的情况

Debug工具基本使用步骤:1.在需要控制的代码行左侧,点击一下,形成断点;2.选择使用Debug方式启动程序,启动之后程序会在断点暂停;3.控制代码一行一行的往下执行

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮卡丘√

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值