Day04_数组

Day04_数组

数组就是用来存储 一批同类型数据内存区域

如果不使用数组:

  • 如果同一类型数据的数据过多,就需要大量变量的定义
  • 业务功能实现麻烦
  • 注意:在java中只有同一类型数据才能存于一个数组中。

今天的任务:

  • 如何定义数组存储数据
    • 定义数组的格式
  • 如何操作中数组元素
    • 如何获取与修改数组数据
  • 怎么解决实际问题
    • 如何完成一些业务功能
  • 数组内存原理
    • 数组如何在内存中工作
  • 数组使用的注意点
    • 避免入坑,同时可以在出现问题后立即排查问题所在

1、数组的定义

1.1、静态初始化数组

​ 在定义数组的过程中直接给数组赋值。

//完整格式 
//数据类型[] 数组名= new 数据类型[]{元素1,元素2......};
double[] scores = new double[]{1,2,3,4,5};
int[] ages = new int[]{3,4,5,6};
//简化格式
//数据类型[] 数组名 = {元素1,元素2.....};
String[] names = {"name1","name2"};
System.out.println(ages);

注意:数组变量名中存储的是数组在内存中的地址,数组是引用类型

基本原理

image-20220212221434588

//数组的访问方法
//数组名称[索引]

数组的注意事项

  • 数据类型[] 数组名 也可以写成数组类型 数组名[]int ages2[] = {3,4,5,6};
  • 什么类型的数组存放什么类型的数据,否则会报错
  • 数组一旦定义,程序执行中长度类型就固定了

1.2、动态初始化数组

​ 定义数组的时候 只确定数组的长度,二部存入具体数值

int []array = new int[3];
System.out.println(array[0]);  //输出结果为0
array[0] = 10;
System.out.println(array[0]); //输出结果为10

元素默认规则

  • 基本类型:
    • byte、short、char、int、long:0
    • float、double:0.0
    • boolean:false
  • 引用类型:
    • 接口、类、数组、String:null

2、数组的遍历

​ 所谓的数组遍历就是要不重复不遗漏的将数组内的内容进行访问。

int ages[] = {1,2,5,3,2};
        for (int i = 0; i < ages.length; i++) {
            System.out.println(ages[i]);
        }

3、数组的案例

 //遍历求和,:某部门5名员工的销售额分别是:16、26、36、6、100,请计算出他们部门的总销售额
        int[] sell = {16,26,36,6,100};
        int sum = 0;
        for (int i = 0; i < sell.length; i++) {
            sum+=sell[i];
        }
        System.out.println(sum);

        //数组最大值求和
        int []faceScores = {15, 9000, 10000, 20000, 9500, -5};
        int max = faceScores[0];
        for (int i = 0; i < faceScores.length; i++) {
            if (max < faceScores[i]){
                max = faceScores[i];
            }
        }
        System.out.println(max);

        //猜数字游戏
        /*
        游戏后台随机生成1-20之间的5个数(无所谓是否重复),然后让大家来猜数字:
                未猜中提示:“未命中”,并继续猜测
                猜中提示:“运气不错,猜中了”,并输出该数据第一次出现的位置,且输出全部5个数据, 最 终结束本游戏
         */
        Random random = new Random();
        int []number = new int [5];
        Scanner sc = new Scanner(System.in);
        int scan;
        boolean flag = false;

        //随机值的赋值
        System.out.print("随机数为:");
        for (int i = 0; i < number.length; i++) {
            number[i] = random.nextInt(20)+1;
            System.out.print(number[i]+" ");
        }
        System.out.println();

        //循环判断是否猜中
        while (true){
            scan = sc.nextInt();
            for (int i = 0; i < number.length; i++) {
                //判断是否猜中
                if (scan == number[i]){
                    System.out.println("地址为"+i);
                    flag = true;
//                    循环输出结果
                    System.out.print("随机数值为:");
                    for (int j = 0; j < number.length; j++) {
                        System.out.print(number[j]+" ");
                    }
                    System.out.println();
                    break;
                }
            }
//            判断是否已经猜中
            if(flag){
                break;
            }else{
                System.out.println("没有猜对哦!!!");
            }
        }

        //随机排名
        /*实现步骤
        * 定义一个动态数组
        * 遍历数组中每个元素,每次随机一个索引值,让当前元素与索引位置处的元素进行交换
        * 遍历输出结果
        * */
        int []employee = {22,35,33,13,88};
        Random rm = new Random();
        int temp,rmIndex;
        for (int i = 0; i < employee.length; i++) {
            rmIndex = rm.nextInt(5);
            temp = employee[rmIndex];
            employee[rmIndex] = employee[i];
            employee[i] = temp;
        }
        for (int i = 0; i < employee.length; i++) {
            System.out.print(employee[i]+" ");
        }
        System.out.println();

        //冒泡排序
        int []employee_sort = {22,35,33,13,88};
        int temp1;
        for (int i = 0; i < employee_sort.length ; i++) {
            for (int j = 0; j < employee_sort.length-i-1; j++) {
                if (employee_sort[j] > employee_sort[j+1]){
                    temp1 = employee_sort[j];
                    employee_sort[j] = employee_sort[j+1];;
                    employee_sort[j+1] = temp1;
                }
            }
        }

        for (int i = 0; i < employee_sort.length; i++) {
            System.out.print(employee_sort[i] +" ");
        }

4、数组的内存图

4.1、Java内存分配、数组内存图

  • :new出来的东西会在这块内存中开辟空间并产生地址
  • :方法运行时所进入的内存,变量也是在这里
  • 方法区:字节码文件加载时进入的内存

image-20220213091727836

代码流程讲解

image-20220213093350276

当两个数组变量指向同一个数组对象时

数组指向的为一个对象地址,并不指向具体的数值,当两个数组指向同一个对象时,其中一个改变数组内容,另一个的内容也会发生改变。

  • 这就是数组赋值中的浅复制,如果想要改变其特性就要在复制过程中进行深复制(创建一个新的数组对象并复制)
  • eg array2 = array1.clone()
 int[] array1 = {1,2,3,4};
        System.out.print("array1内容:");
        for (int i = 0; i < array1.length; i++) {
            System.out.printf(array1[i]+" ");
        }
        System.out.println();
        int[] array2 = array1;
		// int[] array2 = array1.clone();
        array2[1] = 22;

        System.out.print("array1内容:");
        for (int i = 0; i < array1.length; i++) {
            System.out.printf(array1[i]+" ");
        }
        System.out.println();

        System.out.print("array2内容:");
        for (int i = 0; i < array2.length; i++) {
            System.out.printf(array2[i]+" ");
        }
        System.out.println();

		//浅复制输出的结果为
//array1内容:1 2 3 4 
//array1内容:1 22 3 4 
//array2内容:1 22 3 4 

		//深复制的结果
//array1内容:1 2 3 4 
//array1内容:1 2 3 4 
//array2内容:1 22 3 4 

浅复制原理

image-20220213094758234

5、数组使用的常见问题

  • 问题1:方位元素位置超过最大索引 ,报错为:ArrayIndexOutOfBoundsException(数组索引越界异常)
    :1 22 3 4
    //array2内容:1 22 3 4

      //深复制的结果
    

//array1内容:1 2 3 4
//array1内容:1 2 3 4
//array2内容:1 22 3 4


**浅复制原理**

[外链图片转存中...(img-664svFhY-1645156575393)]

## 5、数组使用的常见问题

- 问题1:方位元素位置超过最大索引 ,报错为:ArrayIndexOutOfBoundsException(数组索引越界异常) 
- 问题2 :数组变量中未存储数组地址,为null,访问数组内容,报错为NullPointerException(空指针异常)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值