详细请看这篇博客

参考:https://blog.csdn.net/belonghuang157405/article/details/83410197

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,

Cron有如下两种语法格式:

Seconds Minutes Hours DayofMonth Month DayofWeek Year (秒、分、时、每月第几天、月、星期、年)



Seconds Minutes Hours DayofMonth Month DayofWeek (秒、分、时、每月第几天、月、星期)

注:corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份

字段取值:

字段 允许值 允许的特殊字符
秒(Seconds) 0~59的整数 , - * /    四个字符
分(Minutes) 0~59的整数 , - * /    四个字符
小时(Hours) 0~23的整数 , - * /    四个字符
日期(DayofMonth) 1~31的整数(但是你需要考虑你月的天数) ,- * ? / L W C     八个字符
月份(Month) 1~12的整数或者 JAN-DEC , - * /    四个字符
星期(DayofWeek) 1~7的整数或者 SUN-SAT (1=SUN) , - * ? / L C #     八个字符
年(可选,留空)(Year) 1970~2099 , - * /    四个字符

特殊字符含义: -

  • (1)*:表示匹配该域的任意值。假如在Minutes域使用*, 即表示每分钟都会触发事件。
  • (2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。
  • (3)-:表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
  • (4)/:表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.
  • (5),:表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
  • (6)L:表示最后,只能出现在DayofWeek和DayofMonth域。如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。
  • (7)W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。
  • (8)LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
  • (9)#:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。

需求:模拟真实数据往数据库中同时插入多条数据。

由于要模拟真实数据所以我在网上查了一些工具,比如javaFaker等,发现都满足不了我的实际开发情况。(工具的字段都是封装好了的)

所以我采用的是,用随机数来解决真实数据的问题。

废话不多说,直接上代码

数据库设计:

项目结构

项目启动:

![](https://img2020.cnblogs.com/blog/1348997/202005/1348997-20200530173307567-873738261.png)

springboot配置文件

log4j.porpertis文件

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%5p - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender

log4j.appender.R.File=firestorm.log

log4j.appender.R.MaxFileSize=100KB

log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout

log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n

log4j.logger.com.codefutures=DEBUG

domain包

package com.element.testdata.domain;
import lombok.Data;
import java.io.Serializable;

  1. @Data

public class ElectricData implements Serializable {

  1. private String code;
  2. private String useType;
  3. private Double voltage;
  4. private Double current;
  5. private Integer power;
  6. private Double powerFactro;
  7. private Double eletricEnergy;
  8. private String phase;
  9. private Double freq;
  10. private String time;
  11. private String dataTime;
  12. private String createAt;
  13. private String updateAt;

}

dao包

ElectricDataDao接口:

package com.element.testdata.dao;
import com.element.testdata.domain.ElectricData;
import java.util.List;

public interface ElectricDataDao {

  1. //每分钟触发一次
  2. public void insertData(List<ElectricData> list);
  3. //每小时触发一次
  4. public void insertDataHours(List<ElectricData> list);
  5. //每天触发一次
  6. public void insertDataDay(List<ElectricData> list);

}

ElectricDataDao.xml配置文件 (特别注意,配置文件名与接口名要一致)

  1. <!-- 分钟-->
  2. <insert id="insertData" parameterType="java.util.List">
  3. INSERT INTO tb_electric_data(code,use_type,voltage,current,power,power_factor,electric_energy,phase,freq,time,data_time,created_at,updated_at)
  4. values
  5. <foreach collection="list" item="item" index="index" separator=",">
  6. (#{item.code,jdbcType=VARCHAR},#{item.useType,jdbcType=VARCHAR},#{item.voltage,jdbcType=DOUBLE},#{item.current,jdbcType=DOUBLE},
  7. #{item.power,jdbcType=INTEGER},#{item.powerFactro,jdbcType=DOUBLE},#{item.eletricEnergy,jdbcType=DOUBLE},#{item.phase,jdbcType=VARCHAR},#{item.freq,jdbcType=DOUBLE},
  8. #{item.time,jdbcType=DATE},#{item.dataTime,jdbcType=DATE},#{item.createAt,jdbcType=DATE},#{item.updateAt,jdbcType=DATE}
  9. )
  10. </foreach>
  11. </insert>
  12. <!--小时-->
  13. <insert id="insertDataHours" parameterType="java.util.List">
  14. INSERT INTO tb_electric_data_hour(code,use_type,voltage,current,power,power_factor,electric_energy,phase,freq,time,data_time,created_at,updated_at)
  15. values
  16. <foreach collection="list" item="item" index="index" separator=",">
  17. (#{item.code,jdbcType=VARCHAR},#{item.useType,jdbcType=VARCHAR},#{item.voltage,jdbcType=DOUBLE},#{item.current,jdbcType=DOUBLE},
  18. #{item.power,jdbcType=INTEGER},#{item.powerFactro,jdbcType=DOUBLE},#{item.eletricEnergy,jdbcType=DOUBLE},#{item.phase,jdbcType=VARCHAR},#{item.freq,jdbcType=DOUBLE},
  19. #{item.time,jdbcType=DATE},#{item.dataTime,jdbcType=DATE},#{item.createAt,jdbcType=DATE},#{item.updateAt,jdbcType=DATE}
  20. )
  21. </foreach>
  22. </insert>
  23. <!--天-->
  24. <insert id="insertDataDay" parameterType="java.util.List">
  25. INSERT INTO tb_electric_data_day(code,use_type,voltage,current,power,power_factor,electric_energy,phase,freq,time,data_time,created_at,updated_at)
  26. values
  27. <foreach collection="list" item="item" index="index" separator=",">
  28. (#{item.code,jdbcType=VARCHAR},#{item.useType,jdbcType=VARCHAR},#{item.voltage,jdbcType=DOUBLE},#{item.current,jdbcType=DOUBLE},
  29. #{item.power,jdbcType=INTEGER},#{item.powerFactro,jdbcType=DOUBLE},#{item.eletricEnergy,jdbcType=DOUBLE},#{item.phase,jdbcType=VARCHAR},#{item.freq,jdbcType=DOUBLE},
  30. #{item.time,jdbcType=DATE},#{item.dataTime,jdbcType=DATE},#{item.createAt,jdbcType=DATE},#{item.updateAt,jdbcType=DATE}
  31. )
  32. </foreach>
  33. </insert>

service包

ElectricDataServic

package com.element.testdata.service;
import com.element.testdata.domain.ElectricData;
import java.util.List;

public interface ElectricDataServic {

  1. //每分钟触发一次
  2. public void insertData(List<ElectricData> list);
  3. //每小时触发一次
  4. public void insertDataHours(List<ElectricData> list);
  5. //每天触发一次
  6. public void insertDataDay(List<ElectricData> list);

}

ElectricDataServiceImpl

package com.element.testdata.service.impl;

import com.element.testdata.dao.ElectricDataDao;

import com.element.testdata.domain.ElectricData;

import com.element.testdata.service.ElectricDataServic;

import com.element.testdata.utils.RandomData;

import org.apache.log4j.Logger;

import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.stereotype.Service;

import javax.annotation.Resource;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

@Service

public class ElectricDataServiceImpl implements ElectricDataServic{

  1. private Logger logger = Logger.getLogger(ElectricDataServiceImpl.class);
  2. @Resource
  3. private ElectricDataDao electricDataDao;
  4. @Override
  5. public void insertData(List<ElectricData> list) {
  6. electricDataDao.insertData(list);
  7. }
  8. @Override
  9. public void insertDataHours(List<ElectricData> list) {
  10. electricDataDao.insertDataHours(list);
  11. }
  12. @Override
  13. public void insertDataDay(List<ElectricData> list) {
  14. electricDataDao.insertDataDay(list);
  15. }
  16. @Scheduled(cron = "*/60 * * * * ?") // cron(秒、分、时、每月第几天、月、星期)
  17. public void job(){
  18. RandomData randomData = new RandomData();
  19. List<ElectricData> users = new ArrayList<ElectricData>();
  20. int aUserType = randomData.getRandom(36,39); // 固定每次定时的类型
  21. for (int i=0;i<36;i++){
  22. ElectricData electricData = new ElectricData();
  23. //设置值
  24. electricData.setVoltage(Double.parseDouble(randomData.getList().get(randomData.getRandom(40,46)))); //电压
  25. electricData.setCurrent(Double.parseDouble(randomData.getList().get(randomData.getRandom(47,53)))); //电流
  26. electricData.setPower(Integer.parseInt(randomData.getList().get(randomData.getRandom(54,58)))); //功率
  27. electricData.setPowerFactro(Double.parseDouble(randomData.getList().get(randomData.getRandom(59,63)))); //功率因数
  28. electricData.setEletricEnergy(Double.parseDouble(randomData.getList().get(randomData.getRandom(64,68)))); //总电能
  29. electricData.setFreq(Double.parseDouble(randomData.getList().get(randomData.getRandom(72,75)))); //频数
  30. electricData.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); //时间
  31. electricData.setDataTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  32. electricData.setCreateAt(electricData.getTime());
  33. electricData.setUpdateAt(electricData.getTime());
  34. if ((i+1)%3==1){
  35. electricData.setUseType(randomData.getList().get(aUserType)); //类型
  36. electricData.setPhase( randomData.getList().get(69)); //A
  37. electricData.setCode(randomData.getList().get(i));
  38. }else if ((i+1)%3==2){
  39. electricData.setUseType(randomData.getList().get(aUserType)); //类型
  40. electricData.setPhase( randomData.getList().get(70)); //B
  41. electricData.setCode(randomData.getList().get(i));
  42. }else {
  43. electricData.setUseType(randomData.getList().get(aUserType)); //类型
  44. electricData.setPhase( randomData.getList().get(71)); //C
  45. electricData.setCode(randomData.getList().get(i));
  46. }
  47. users.add(electricData);
  48. //类型 每三次变化一次
  49. if((i+1)%3==0){
  50. aUserType = randomData.getRandom(36,39);
  51. }
  52. }
  53. insertData(users);
  54. System.out.println("service中执行了分钟定时器。。。");
  55. logger.info("分钟定时任务:"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
  56. }
  57. @Scheduled(cron = "0 0 * * * ?") // cron(秒、分、时、每月第几天、月、星期)
  58. public void jobHours(){
  59. RandomData randomData = new RandomData();
  60. List<ElectricData> users = new ArrayList<ElectricData>();
  61. int aUserType = randomData.getRandom(36,39); // 固定每次定时的类型
  62. for (int i=0;i<36;i++){
  63. ElectricData electricData = new ElectricData();
  64. //设置值
  65. electricData.setVoltage(Double.parseDouble(randomData.getList().get(randomData.getRandom(40,46)))); //电压
  66. electricData.setCurrent(Double.parseDouble(randomData.getList().get(randomData.getRandom(47,53)))); //电流
  67. electricData.setPower(Integer.parseInt(randomData.getList().get(randomData.getRandom(54,58)))); //功率
  68. electricData.setPowerFactro(Double.parseDouble(randomData.getList().get(randomData.getRandom(59,63)))); //功率因数
  69. electricData.setEletricEnergy(Double.parseDouble(randomData.getList().get(randomData.getRandom(64,68)))); //总电能
  70. electricData.setFreq(Double.parseDouble(randomData.getList().get(randomData.getRandom(72,75)))); //频数
  71. electricData.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); //时间
  72. electricData.setDataTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  73. electricData.setCreateAt(electricData.getTime());
  74. electricData.setUpdateAt(electricData.getTime());
  75. if ((i+1)%3==1){
  76. electricData.setUseType(randomData.getList().get(aUserType)); //类型
  77. electricData.setPhase( randomData.getList().get(69)); //A
  78. electricData.setCode(randomData.getList().get(i));
  79. }else if ((i+1)%3==2){
  80. electricData.setUseType(randomData.getList().get(aUserType)); //类型
  81. electricData.setPhase( randomData.getList().get(70)); //B
  82. electricData.setCode(randomData.getList().get(i));
  83. }else {
  84. electricData.setUseType(randomData.getList().get(aUserType)); //类型
  85. electricData.setPhase( randomData.getList().get(71)); //C
  86. electricData.setCode(randomData.getList().get(i));
  87. }
  88. users.add(electricData);
  89. //类型 每三次变化一次
  90. if((i+1)%3==0){
  91. aUserType = randomData.getRandom(36,39);
  92. }
  93. }
  94. insertDataHours(users);
  95. System.out.println("service中执行了小时定时器。。。");
  96. logger.info("小时定时任务:"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
  97. }
  98. @Scheduled(cron = "0 0 0 * * ? ") // cron(秒、分、时、每月第几天、月、星期)
  99. public void jobDay(){
  100. RandomData randomData = new RandomData();
  101. List<ElectricData> users = new ArrayList<ElectricData>();
  102. int aUserType = randomData.getRandom(36,39); // 固定每次定时的类型
  103. for (int i=0;i<36;i++){
  104. ElectricData electricData = new ElectricData();
  105. //设置值
  106. electricData.setVoltage(Double.parseDouble(randomData.getList().get(randomData.getRandom(40,46)))); //电压
  107. electricData.setCurrent(Double.parseDouble(randomData.getList().get(randomData.getRandom(47,53)))); //电流
  108. electricData.setPower(Integer.parseInt(randomData.getList().get(randomData.getRandom(54,58)))); //功率
  109. electricData.setPowerFactro(Double.parseDouble(randomData.getList().get(randomData.getRandom(59,63)))); //功率因数
  110. electricData.setEletricEnergy(Double.parseDouble(randomData.getList().get(randomData.getRandom(64,68)))); //总电能
  111. electricData.setFreq(Double.parseDouble(randomData.getList().get(randomData.getRandom(72,75)))); //频数
  112. electricData.setTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); //时间
  113. electricData.setDataTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
  114. electricData.setCreateAt(electricData.getTime());
  115. electricData.setUpdateAt(electricData.getTime());
  116. if ((i+1)%3==1){
  117. electricData.setUseType(randomData.getList().get(aUserType)); //类型
  118. electricData.setPhase( randomData.getList().get(69)); //A
  119. electricData.setCode(randomData.getList().get(i));
  120. }else if ((i+1)%3==2){
  121. electricData.setUseType(randomData.getList().get(aUserType)); //类型
  122. electricData.setPhase( randomData.getList().get(70)); //B
  123. electricData.setCode(randomData.getList().get(i));
  124. }else {
  125. electricData.setUseType(randomData.getList().get(aUserType)); //类型
  126. electricData.setPhase( randomData.getList().get(71)); //C
  127. electricData.setCode(randomData.getList().get(i));
  128. }
  129. users.add(electricData);
  130. //类型 每三次变化一次
  131. if((i+1)%3==0){
  132. aUserType = randomData.getRandom(36,39);
  133. }
  134. }
  135. insertDataDay(users);
  136. System.out.println("service中执行了天定时器。。。");
  137. logger.info("天定时任务:"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
  138. }

}

utils包

RandomData

package com.element.testdata.utils;

import java.util.ArrayList;

import java.util.Random;

public class RandomData {

  1. ArrayList<String> list;
  2. public ArrayList<String> getList() {
  3. //设置随机数
  4. list = new ArrayList<String>(){{
  5. //code 36 0 - 35
  6. add("01A");
  7. add("01B");
  8. add("01C");
  9. add("02A");
  10. add("02B");
  11. add("02C");
  12. add("03A");
  13. add("03B");
  14. add("03C");
  15. add("04A");
  16. add("04B");
  17. add("04C");
  18. add("05A");
  19. add("05B");
  20. add("05C");
  21. add("06A");
  22. add("06B");
  23. add("06C");
  24. add("07A");
  25. add("07B");
  26. add("07C");
  27. add("08A");
  28. add("08B");
  29. add("08C");
  30. add("09A");
  31. add("09B");
  32. add("09C");
  33. add("10A");
  34. add("10B");
  35. add("10C");
  36. add("11A");
  37. add("11B");
  38. add("11C");
  39. add("12A");
  40. add("12B");
  41. add("12C");
  42. //user_type 4 36-39
  43. add("照明");
  44. add("插座");
  45. add("空调");
  46. add("电脑");
  47. //voltage 7 40-46
  48. add("224.68");
  49. add("222.13");
  50. add("225.44");
  51. add("223.06");
  52. add("227.09");
  53. add("226.01");
  54. add("225.05");
  55. //current 7 47-53
  56. add("1.59");
  57. add("1.53");
  58. add("3.00");
  59. add("4.00");
  60. add("2.31");
  61. add("1.43");
  62. add("1.34");
  63. //power 5 54-58
  64. add("2");
  65. add("3");
  66. add("5");
  67. add("7");
  68. add("4");
  69. //powerFactro 5 59-63
  70. add("0.999");
  71. add("1.999");
  72. add("2.35");
  73. add("3.12");
  74. add("0.09");
  75. //eletricEnergy 5 64-68
  76. add("0.625");
  77. add("1.78");
  78. add("2.56");
  79. add("3.37");
  80. add("0.25");
  81. //phase 3 69-71
  82. add("A");
  83. add("B");
  84. add("C");
  85. //freq 4 72-75
  86. add("50.0");
  87. add("49.96");
  88. add("50.03");
  89. add("49.91");
  90. }};
  91. return list;
  92. }
  93. int anInt;
  94. Random random = new Random();
  95. public int getRandom(int min,int max){ // min最小,max最大 获取[min,max]之间的数
  96. anInt = random.nextInt(max)%(max-min+1) + min;
  97. return anInt;
  98. }

}

Cron表达式,springboot定时任务的更多相关文章

  1. 使用Cron表达式创建定时任务

    CronTriggerCronTrigger功能非常强大,是基于日历的作业调度,而SimpleTrigger是精准指定间隔,所以相比SimpleTrigger,CroTrigger更加常用.CroTr ...

  2. 详解定时任务中的 cron 表达式

    1.前言 我们经常使用 cron 表达式来定义定时任务的执行策略,今天我们就总结一下 cron 表达式的一些相关知识. 2. cron 表达式的定义 cron 表达式是一个字符串,该字符串由 6 个空 ...

  3. springboot内嵌定时任务使用及cron表达式讲解

    第一步:pom引入依赖 <dependencies> <dependency> <groupId>org.springframework.boot</grou ...

  4. 摆脱Spring 定时任务的@Scheduled cron表达式的困扰

    一.背景 最近因为需要,需要适用Spring的task定时任务进行跑定时任务,以前也接触过,但是因为懒没有好好地理解@Scheduled的cron表达式,这次便对它做了一个全方位的了解和任务,记录下来 ...

  5. (2)Spring集成Quartz定时任务框架介绍和Cron表达式详解

    在JavaEE系统中,我们会经常用到定时任务,比如每天凌晨生成前天报表,每一小时生成汇总数据等等.我们可以使用java.util.Timer结合java.util.TimerTask来完成这项工作,但 ...

  6. Spring集成Quartz定时任务框架介绍和Cron表达式详解

    原文地址:http://www.cnblogs.com/obullxl/archive/2011/07/10/spring-quartz-cron-integration.html 在JavaEE系统 ...

  7. Quartz.net 定时任务之Cron表达式

    一.cron表达式简单介绍和下载 1.在上一篇博客"Quartz.net 定时任务之简单任务"中,我简单介绍了quartz的使用,而这篇博客我将介绍cron的具体使用(不足之处望大 ...

  8. 摆脱定时任务的cron表达式的困扰

    一.背景 最近因为需要,需要适用Spring的task定时任务进行跑定时任务,以前也接触过,但是因为懒没有好好地理解@Scheduled的cron表达式,这次便对它做了一个全方位的了解和任务,记录下来 ...

  9. Quartz 定时任务设置某个时间区间每隔一定时间触发的cron表达式

    原文:https://blog.csdn.net/yansong_8686/article/details/46991189 Cron表达式 Quartz使用类似于Linux下的Cron表达式定义时间 ...

随机推荐

  1. Rabbitmq 报错 nodedown

    问题描述 线上 rabbitmq 集群账号密码设置的过于简单,有一定的风险.在整改过程中发现,三台机器信息错乱,每台服务器执行rabbitmq 相关的命令就报错,Error: unable to co ...

  2. You should consider upgrading via the 'python -m pip install --upgrade pip' command.

    pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', ...

  3. Java流程控制以及顺序、选择、循环结构

    目录 用户交互Scanner Scanner对象 hasNext()与next() hasNextLine()与nextLine() Scanner进阶用法 求和与平均数 顺序结构 选择结构 if单选 ...

  4. Getting Started With Node and NPM

    Getting Started with Node and NPM Let's start with the basics. Install Node.js: https://nodejs.org.

  5. #!/usr/bin/python

    它是用来指定用什么解释器运行脚本以及解释器所在的位置. 参考链接:https://www.cnblogs.com/qmfsun/p/6291982.html

  6. 手把手教你Windows Linux双系统的安装与卸载

    作者:-叶丶知秋 链接:https://blog.csdn.net/fanxueya1322/article/details/90205143 转载请保留出处 良许前言: 后台突然有很多小伙伴留言想看 ...

  7. 一文带你了解nginx基础

    学习nginx,就要先了解什么是nginx,为什么使用nginx,最后才是了解怎么使用nginx nginx简介 nginx安装 一.Linux中安装nginx 二.Docker中安装nginx 三. ...

  8. DQN(Deep Q-learning)入门教程(三)之蒙特卡罗法算法与Q-learning算法

    蒙特卡罗法 在介绍Q-learing算法之前,我们还是对蒙特卡罗法(MC)进行一些介绍.MC方法是一种无模型(model-free)的强化学习方法,目标是得到最优的行为价值函数\(q_*\).在前面一 ...

  9. [JavaWeb基础] 029.OGNL表达式介绍

    1.OGNL概述 OGNL,全称为Object-Graph Navigation Language,它是一个功能强大的表达式语言,用来获取和设置Java对象的属性,它旨在提供一个更高的更抽象的层次来对 ...

  10. ES6-常用四种数组

    1.map 1.1 个人理解 映射 一个对一个 例如:[45,57,138]与[{name:'blue',level:0},{name:'zhangsan',level:99},{name:'lisi ...