06 数组

news2025/1/18 6:45:21

本文仅作为个人笔记

数组

数组的引入

import java.util.Scanner;
public class TestArray01{
	public static void main(String[] args){
		//功能:键盘录入是个学生的成绩,求和,求平均数:
		//定义一个求和的变量:
		int sum = 0;
		Scanner sc = new Scanner(System.in);
		for(int i = 0; i<10;i++){//i:控制循环次数
			System.out.println("请录入第"+i+"个学生的成绩");
			int score = sc.nextInt();
			sum += score
		}
		System.out.println("是个学生的成绩之和为:"+sum);
		System.out.println("是个学生的成绩平均数为:"+sum/10);
		
		//这样写的缺点:
		//算出总成绩之后无法获得其中每个学生的成绩
	}
}

缺点:不能求每个学生的具体成绩是多少

解决:将成绩进行存储—》引入:数组

数组的作用:数组用来存储数据的,在程序设计中,为了处理方便,数组用来将相同类型的若干个数据组织起来,若干个数据的集合称为数组

数组的定义

静态初始化数组

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

静态初始化数组的格式
//完整格式
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
double[] score = new double[]{1.1,1.2,1.3,1.4};
int[] ages = new int[]{11,12,13};
//简化格式
数据类型[] 数组名 = {元素1,元素2,元素3,...};
int[] ages = {12,24,36}
数组的存储原理

在这里插入图片描述
在这里插入图片描述

  • 数组的访问

    数组名称[索引]

       System.out.println(scores[0]);//1.1
       System.out.println(scores[2]);//1.3
       scores[2] = 1.9;//数组的再赋值
       System.out.println(scores[2]);//1.9
    

    数组的长度属性:length

     //长度属性:length
     //获取数组的长度(就是数组的个数)
     System.out.println(scores.length);//4
    

    数组的最大索引

    数组的最大索引:数组名.length - 1 //前提:元素个数大于0
    
  • 数组的注意事项

    • 数据类型[] 数组名 也可以写成 数据类型 数组名[]

      int[] ages =...;
      int ages[] = ...;
      
      double[] scores = ...;
      double[] = scores = ...;
      
    • 什么类型的数组存放什么类型的数据,否则报错

      int[] arrs = new int[]{30,40,"黑马"};
      
    • 数组一旦定义出来,程序执行的过程中,长度、类型就固定了。

public class ArrayAttentionDemo03 {
    public static void main(String[] args) {
        //目标:理解数组的注意事项
        //1、数据类型[] 数组名称 也可以写成 数据类型 数组名称[]
        int[] ages = {11,12,13};
        //int ages[] = {11,12,13};

        //2、什么类型的数组只能存放什么类型的元素
        // String[] names = {"小明","小王",22};//错误的

        //3、数组一旦定义出来之后,类型和长度就固定了
        int[] ages2 = {22,23,24};
        //System.out.println(ages2[3]);//报错,长度固定是三了不能访问第四个元素
    }
}

总结:

1.如何访问数组的元素

数组名称[索引]

2.如何访问数组的长度

数组名称.length

3.数组的最大索引怎么获取?

数组的最大索引:数组名.length - 1 //前提:元素个数大于0
public class ArrayDemo01 {
    public static void main(String[] args){
        //目标:学会使用静态初始化的方式定义数组
        //数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
       // double[] scores = new double[]{1.1,1.2,1.3,1.4};
        double[] scores = {1.1,1.2,1.3,1.4};

       // int[] ages = new int[]{11,12,13};
        int[] ages ={11,12,13};

       // String[] names = new String[]{"小明","小红","小王"};
        String[] names = {"小明","小红","小王"};

        System.out.println("scores中存的是:"+scores);
        System.out.println(scores[0]);//1.1
        System.out.println(scores[2]);//1.3
        scores[2] = 1.9;
        System.out.println(scores[2]);//1.9

        //长度属性:length
        //获取数组的长度(就是数组的个数)
        System.out.println(scores.length);//4
    }
}
public class ArrayDemo02 {
    public static void main(String[] args) {
        //目标:学会访问数组的元素
        int [] ages = {11,12,13,14};

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

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

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

        //数组的最大索引:数组名.length - 1 //前提:元素个数大于0
    }
}
动态初始化数组
数组的动态初始化
  • 定义数组的时候只确定元素的类型和数组的长度,之后再存入具体数据
数组的动态初始化格式:
数据类型[] 数组名 = new 数据类型[长度];
int[] arr = new int[3];

//后赋值
arr[0] = 10;
System.out.println(arr[0]);//10

总结

1.动态初始化的写法是什么样的?

数据类型[] 数组名 = new 数据类型[长度];
int[] arr = new int[4];

2.两种数组定义时的特点和场景有什么区别

当前已经知道存入的元素值,用静态初始化。
当前还不清楚要存入哪些数据,用动态初始化
动态初始化数组的元素默认值
数据类型明细默认值
基本类型byte、short、char、int、long0
基本类型float、double0.0
基本类型booleanfalse
引用类型类、接口、数组、Stringnull

两种初始化的使用场景总结、注意事项说明:

  • 动态初始化:只 指定数据 长度,后期赋值 ,适合开始知道数据的数量,但是不确定具体元素值的业务场景。

  • 静态初始化:开始就存入元素值,适合一开始就能确定元素值的业务场景。

  • 两种格式的写法时严格独立的,不可以混用

    int[] arrs = new int[3]{30,40,50}//这是错误的
    
    public class ArrayDemo05 {
        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
    
            //2、字符数组的元素默认值都是0
            char[] chars = new char[100];
            System.out.println((int)chars[0]);//0
            System.out.println((int)chars[99]);//0
    
            //3、浮点型数组的元素默认值都是0.0
            double[] scores = new double[90];
            System.out.println(scores[0]);//0.0
            System.out.println(scores[89]);//0.0
    
            //4、布尔类型的数组
            boolean[] booleans = new boolean[100];
            System.out.println(booleans[0]);//false
            System.out.println(booleans[99]);//false
    
            //5、引用类型的数组
            String[] names = new String[90];
            System.out.println(names[0]);//null
            System.out.println(names[89]);//null
    
        }
    }
    

总结

1.动态初始化数组后元素的迷人之是什么样的?

  • byte、short、int、long、char类型数组元素的默认值都是0
  • float double 类型数组元素的默认值都是0.0
  • boolean 类型数组元素的默认值是false、String类型数组元素的默认值是null

数组的遍历

  • 遍历:就是一个一个数据的访问
  • 遍历的作用:搜索、数据统计等等都需要用到遍历。
int[] ages = {20,30,40,50};
for(int i = 0; i <ages.length; i++){
    System.out.println(ages[i]);
}
public class ArrayDemo {
    public static void main(String[] args) {
        //目标:学会进行数组元素的遍历
        int[] arr ={12,24,36,48};
        //数组遍历形势
        //数组快捷方式:数组名.fori
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

总结:

1.什么是遍历?

  • 一个一个的把数据访问一遍

2.如何遍历数组?

 int[] arr ={12,24,36,48};
 for (int i = 0; i < arr.length; i++) {
      System.out.println(arr[i]);
  }

数组的案例

  • 数组元素求和

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

    public class Test01 {
     public static void main(String[] args) {
         //需求数组求和
         int[] money ={16,26,36,6,100};
         //定义总和
         int sum = 0;
         //遍历数组中的每个元素
         for (int i = 0; i < money.length; i++) {
             sum +=money[i];
         }
         System.out.println("总金额为"+sum);//184
     }
    }
    

    总结

    1.如何实现批量数据的求和?

    • 使用数组存储批量数据

      int[] money ={16,26,36,6,100};
      
    • 遍历数组中的每个数据,然后定义变量把他们累加起来

          //定义总和
          int sum = 0;
          //遍历数组中的每个元素
          for (int i = 0; i < money.length; i++) {
              sum +=money[i];
          }
          System.out.println("总金额为"+sum);//184
      
  • 数组求最值

    public class Test02 {
     public static void main(String[] args) {
         //需求:求数组元素最值。
         //1.定义一个静态初始化的数组,存储一批数据
         int[] data = {12,800,9000,20000,0,-5};
    
         //2.定义一个变量用于存储最大值元素,建议使用第一个元素作为参照
         int max = data[0];
    
         //3.遍历数组的每个元素,依次与最大值变量的数据比较,若较大,则替换。
         for (int i = 0; i < data.length; i++) {
             if(max<data[i]){
                 max = data[i];
             }
         }
         //4.输出最大值变量存储的数据
         System.out.println("最大值为"+max);//20000
     }
    }
    

    总结:

    1.数组元素求最大值如何实现的?

    • 数据拿到程序中去,用数组存储起来
    • 定义一个变量用于记录最大值,这个变量建议默认存储第一个元素值作为参照
    • 遍历数组的元素,如果该元素大于变量存储的元素,则替换变量存储的值为该元素
  • 猜数字游戏

    需求:开发一个幸运小游戏,游戏规则如下:

    游戏后台随机生成1-20之间的5个数(无所谓是否重复),然后让大家来猜数字

    • 未猜中提示:“未命中”,并继续猜测
    • 猜中提示:“运气不出,猜中了”,并输出该数据第一次出现的位置,且输出全部5个数据,最终结束本游戏。
    public class Test03 {
        public static void main(String[] args) {
            //需求:5个 1-20之间的是随机数,让用户猜测,猜中要提示猜中,还要输出该数据再数组中第一次出现的索引,并打印数组的内容出来。
            //没有猜中接续。
    
            //1、定义一个动态初始化数组存储5个随机的1-20之间的数据
            int[] data = new int[5];
            //2.动态的生成5个1-20之间的随机数并存入到数组中去。
            for (int i = 0; i <data.length ; i++) {
                //
                data[i]=  (int) (Math.random() * 20) + 1;
            }
    
            //3.使用一个死循环让用户进行猜测
            Scanner sc = new Scanner(System.in);
            OUT:
            while (true){
                System.out.println("请您输入一个1-20之间的整数进行猜测:");
                int guessData= sc.nextInt();
    
                //4.遍历数组中的每个数,看是否有数据与猜测的数据相同,相同代表猜中了,给出提示
                for (int i = 0; i < data.length; i++) {
                    if(data[i] == guessData){
                        System.out.println("您已经猜中了该数据,运气不错了!您猜中的数据索引是:" + i);
                        break OUT;//结束了整个死循环代表游戏结束了!
                    }
                }
                System.out.println("当前猜测的数据在数组中不存在,请重新猜测!");
            }
    
            //5、输出数组的全部元素,让用户看到自己确实是猜中了某个数据。
            for (int i = 0; i < data.length; i++) {
                System.out.print(data[i] + "\t");
            }
        }
    }
    

    总结:

    猜数字游戏的实现步骤?

    • 动态初始化数组,存入5个随机的1-20之间的数据
    • 定义一个死循环,不断的才数据,遍历数组,判断数据是否再数组中,如果在,进行对应提示并结束死循环;如果没有猜中,提示继续
  • 随机排名

    需求:某公司开发部5名开发人员,要进行项目进展汇报演讲,现在采取随机排名后进行汇报。

    请线依次录入5名员工的工号,然后展示出一组随机的排名顺序

    22、33、35、13、88 -----》13、35、88、33、22

    分析:

    • 在程序录入5名员工的工号存储起来 —》使用数组
    • 依次遍历数组中的每个元素,随机一个索引数据,让当前元素与该索引位置处的元素进行交换。
    public class Test04 {
        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++) {
                //当前遍历的元素值:code[i]
                //随机一个索引位置出来:codes[index];
                int index = r.nextInt(codes.length);
    
                //定义一个临时变量存储index位置处的值
                int temp = codes[index];
                codes[index] = codes[i];
                codes[i] = temp;
            }
    
            //遍历数组元素输出就是随机排名的结果
            for (int i = 0; i < codes.length; i++) {
                System.out.print(codes[i] + "\t");
            }
        }
    }
    

    总结:

    如何实现随机排名

    • 定义一个动态初始化的数组用于录入数据。
    • 遍历数组中的每个元素,每次随机一个索引值,让当前元素与该索引位置处的元素进行交换。
  • 数组排序

    数组排序就是对数组中的元素,进行升序(由小到大)或者降序(由大到小)的操作。

    数组排序的技术

    • 冒泡排序
    • 选择排序
    • 快速排序
    • 插入排序

    数组搜索相关的技术

    • 二分搜索
    • 分块查找
    • 哈希表查找

    冒泡排序思路

    • 每次从数组中找出最大值放在数组中的最后面去(每个索引的数据都比较一遍)

    实现冒泡排序的步骤分析

    • 确定总共需要做几轮:数组的长度-1

    • 每轮做几次:

      i(轮数)次数次数规律
      13数组的长度-1
      22
      31

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bs10o9Ms-1668566772252)(C:\Users\邢金政\Pictures\冒泡排序.png)]

    public class Test05 {
        public static void main(String[] args) {
            //定义一个数组,存储一些数据
            int[] arr = {5,2,3,1};
            //           0,1,2,3
    
            //2.定义一个循环控制比较的轮数
            for (int i = 0; i < arr.length -1; i++) {
                //i = 0 时 比较3次 j = 0,1,2
                //i = 1 时 比较2次 j = 0,1
                //i = 2 时 比较1次 j = 0
                for (int j = 0; j <arr.length - i -1; j++) {
                    //判断j当前位置的索引值 是否 大于后一个位置 若较大 则交换
                    if(arr[j] > arr[j+1]){
                        int temp =  arr[j+1];
                        arr[j+1] = arr[j];
                        arr[j] = temp;
                    }
    
                }
            }
    
            //遍历数组内容输出
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i]+"\t");
            }
        }
    }
    

    总结

    冒泡排序的思想

    • 从头开始两两比较,把较大的元素与较小的元素进行交换
    • 每轮把当前最大的一个元素存入到数组当前的末尾。

    冒泡排序的实现步骤

    • 定义一个外部循环控制总共需要判断几轮(数组的长度-1)
    • 定义一个内部循环,控制每轮一次往后比较几个位置(数组长度 -i-1)

数组的内存原理

Java内存分配、数组内存图

Java内存分配介绍

  • 方法区
  • 本地方法栈
  • 寄存器

在这里插入图片描述

在这里插入图片描述

两个变量指向同一个数组对象 在这里插入图片描述
数组使用常见问题

问题1:如果访问的元素位置超过最大索引,执行时会出现ArrayIndexOutBoundsException(数组索引越界异常)

public class Test06 {
 public static void main(String[] args) {
     int[] arr ={11,22,33};
     System.out.println(arr[2]);//33
     System.out.println(arr[3]);//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
 }
}

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

public class Test06 {
 public static void main(String[] args) {
     int[] arr ={11,22,33};
     System.out.println(arr[2]);//33

     arr = null;
     System.out.println(arr);//null
     //System.out.println(arr.length);//Exception in thread "main" java.lang.NullPointerException

 }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GoF之代理模式

GoF之代理模式 1、 对代理模式的理解 生活场景1&#xff1a;牛村的牛二看上了隔壁村小花&#xff0c;牛二不好意思直接找小花&#xff0c;于是牛二找来了媒婆王妈妈。这里面就有一个非常典型的代理模式。牛二不能和小花直接对接&#xff0c;只能找一个中间人。其中王妈妈是代…

Linux | 磁盘结构 | 文件系统认识 | inode | 软硬链接

文章目录磁盘物理结构的认识磁盘的分区inode和文件数据之间的映射文件名和inode之间的映射文件知道自己的inode号吗&#xff1f;文件的软硬链接硬链接数磁盘物理结构的认识 &#xff08;图片来自于网络&#xff09;一个磁盘由许多盘片构成&#xff0c;每个盘片上有着许多磁道&a…

SAP Table function 执行报错 code CX_SQL_EXCEPTION feature not supported 该如何分析

我的知识星球里有朋友提问&#xff1a; 我的场景是cds 调用 table function, table function 调用 amdp 然后报错: code:CX_SQL_EXCEPTION message: feature not supported.Contains predicates only supported when table function is unfolded? 请问这个是什么意思&#xf…

使用分贝的波动大小将声音数据降维成字符

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景 正文 总结 背景描述

【高速数字化仪应用案例系列】虹科数字化仪在大型物理实验领域的应用

大型物理实验应用 了解物质和自然力量的使命推动着在物理学科领域进行更大&#xff0c;更复杂的实验。为了做到这一点&#xff0c;科学家和工程师正在建造比以往更大&#xff0c;更强大&#xff0c;更灵敏的机器和仪器。例如&#xff0c;天文学家正在使用不断膨胀的电磁波谱部…

【序列召回推荐】(task1)NeuralCF(学习匹配函数)

note&#xff1a; 和协同过滤矩阵分解的区别&#xff1a;NeuralCF 用一个多层的神经网络替代掉了原来简单的点积操作&#xff0c;另外user隐向量和item隐向量在进入MLP前需要concat拼接&#xff0c;其实就是两个矩阵在水平位置上拼接而已。这样就可以让用户和物品隐向量之间进…

5 分钟教你搭建「视频动作分类」系统

写在前面 在之前的文章中&#xff0c;我们已经搭建过「以文搜图」、「以图搜图」等搜索服务&#xff0c;而今天这篇文章&#xff0c;将要教会你如何搭建一个「视频动作分类」的 AI 系统&#xff01; 例如&#xff0c;我们只需放上一张“婴儿吃胡萝卜”的视频&#xff0c;这个…

代码随想录57——动态规划:647回文子串、516最长回文子序列

文章目录1.647回文子串1.1.题目1.2.解答2.516最长回文子序列2.1.题目2.2.解答1.647回文子串 参考&#xff1a;代码随想录&#xff0c;647回文子串&#xff1b;力扣题目链接 1.1.题目 1.2.解答 动规五部曲&#xff1a; 1.确定dp数组&#xff08;dp table&#xff09;以及下标…

如何优雅的使用 IDEA Debug 进行调试

如何优雅的使用 IDEA Debug 进行调试 Debug 是我们在开发过程中经常会使用到的一种排查问题的手段&#xff0c;我们用它来定位分析异常的出现&#xff0c;以及程序在运行中参数的变化。 IDEA 本身具有很强的调试功能&#xff0c;掌握 IDEA 的一些 Debug 技巧&#xff0c;对我们…

【JS】原生js实现矩形框的绘制/拖动/拉伸

1、要点及功能描述 通过js监听mouse事件来实现矩形框的绘制&#xff0c;再通过区分点击的是边角还是其他位置来实现矩形框的拉伸和拖动&#xff0c;并且在拖动和拉伸时&#xff0c;都做了边界限制&#xff0c;当拉伸或拖动 到边界时&#xff0c;就不能继续拉伸拖动了。当然在相…

7个实用有效的shopify运营策略,跨境电商卖家必知

关键词&#xff1a;shopify运营、跨境电商卖家 您的Shopify 在线商店是使用当今最好的平台之一构建的。2022 年第二季度&#xff0c;Shopify 在美国电子商务平台中占据最大市场份额&#xff0c;约占美国所有在线业务的 32%。 这也意味着电子商务品牌之间的竞争比以往任何时候都…

【图像融合】基于matlab DSIFT多聚焦图像融合【含Matlab源码 2224期】

⛄一、SIFT配准简介 1 算法概述 在实时系统中&#xff0c;算法的输入为相机数据流&#xff0c;当前输入的图像与上一张相似度很高时应不参与融合&#xff0c;由于在体视显微镜下序列图像存在较大程度的偏移&#xff0c;所以融合前还需要进行图像配准&#xff0c;配准完成后再进…

安杰思提交注册:预计2022年度收入不低于3.5亿元,同比增长15%

11月16日&#xff0c;杭州安杰思医学科技股份有限公司&#xff08;下称“安杰思”&#xff09;在上海证券交易所科创板提交招股书&#xff08;注册稿&#xff09;。据贝多财经了解&#xff0c;安杰思于2022年6月24日在科创板递交上市申请材料&#xff0c;2022年11月7日获得上市…

面试--线程池的执行流程和拒绝策略有哪些?

一. 执行流程 聊到线程池就一定会聊到线程池的执行流程, 也就是当有一个任务进入线程池之后, 线程池是如何执行的? 想要真正的了解线程池的执行流程&#xff0c;就得先从线程池的执行方法 execute() 说起, execute() 实现源码如下: public void execute(Runnable command)…

2.10.2版本的青龙升级2.10.13及2.11.3版本的教程

重要提醒&#xff1a; 这个教程仅限使用我下面这个命令搭建的青龙面板使用 docker run -dit \--name QL \--hostname QL \--restart always \-p 5700:5700 \-v $PWD/QL/config:/ql/config \-v $PWD/QL/log:/ql/log \-v $PWD/QL/db:/ql/db \-v $PWD/QL/scripts:/ql/scripts \-…

【消息队列笔记】chp3-如何确保消息不丢失

一、检测消息是否丢失 我们要保证消息的可靠交付&#xff0c;首先就要知道消息是否丢失了。如何做到这一点呢&#xff1f; 对于IT基础设施比较完善的公司&#xff0c;可以使用分布式链路追踪系统来追踪每一条消息。如果没有这样的系统&#xff0c;可以使用消息的有序性来验证…

圆角矩形不是圆:圆角的画法和二阶连续性

本文中的所有重要图片都会给出基于Matplotlib的Python绘制代码以供参考 引言 如果在百度搜索圆角矩形的画法&#xff0c;那么多数结果都会告诉你&#xff0c;就是把一个普通矩形的拐角换成相切的 14\frac{1}{4}41​ 圆弧&#xff0c;就像 引文1 和 引文2 说的那样。然而&#x…

网络规划设计与综合布线技术详解

一、网络工程概述 1、计算机网络及其组成 计算机网络是现代通信技术与计算机技术相结合的产物。 随着计算机网络本身的发展,人们认为:计算机网络是把地理位置不同、功能独立自治的计算机系统及数据设备通过通信设备和线路连接起来,在功能完善的网络软件运行支持下,以实现…

springboot+vue实现excel的导出

首先是springboot对数据的处理 依赖的导入 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency>RequestMapping("/exportExcel") public R exportR…

【SpringBoot项目】SpringBoot项目-瑞吉外卖【day01】

文章目录前言软件开发整体介绍软件开发流程瑞吉外卖项目介绍项目介绍产品原型展示技术选型功能架构角色开发环境搭建数据库环境搭建maven项目搭建设置静态资源映射后台登录需求分析代码开发功能测试后台退出需求分析代码开发功能测试&#x1f315;博客x主页&#xff1a;己不由心…