• 解决使用数组产生的堆问题


    今天不知道怎么的,被人测出了数据异常(写完自己测过是没有问题,现在不知道怎么就有问题了,不过也确实是有问题。不仔细看还真忽略的,在此记录一下)

    AirRankingReq.java

    @Data
    public class AirRankingReq extends CommonReq{
        private String[] siteNumber;
        /** 站点类型 */
        private String siteType;
        /** 区域 */
        private String belongingRegion;
    
        private String sqlin;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    CommconReq是用来接收前端传过来的数据,注意看siteNumber,可以看到成功正常接收到参数

    在这里插入图片描述

    继续走,可以看到我这里吧siteNumber复制给了一个arr的数组,值正常

    在这里插入图片描述
    接下来执行完for语句,处理一下arr数组中的数据(异常就出现了)

    看到了吧,我对arr这个数组的数据做了处理,但是呢我的CommconReq对象的siteNumber数组也随之发生了更改

    在这里插入图片描述
    打印的是同一个地址值
    在这里插入图片描述

    问题分析:数组在java的堆内存中,这里String[] arr = commonReq.getSiteNumber();并不是直接把值给了arr,而是吧SiteNumbe的内存地址值给到了arr,所以它们指向的同一个地址,任何一方被修改了,另一方也跟着被修改了。

    问题既然找到了,那我们只需要让数组不在指向同一个地址,这样发生更改也不会影响其它的。

    • 解决方式一:

    -一个使用集合,一个使用数组(改请求的,或者改接收的都行,自己随意,我这里改请求的)

    @Data
    public class AirRankingReq extends CommonReq{
        private List<String> siteNumber;
        /** 站点类型 */
        private String siteType;
        /** 区域 */
        private String belongingRegion;
    
        private String sqlin;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    将集合转成数组赋值给arr

     String[] arr = commonReq.getSiteNumber().toArray(new String[0]);
    
    • 1

    可以看到成功的不影响siteNumber的值,它们所指向的地址不同了

    在这里插入图片描述

    • 解决方式二:

    不需要一个使用集合一个使用数组,直接使用Arrays.stream()

    AirRankingReq.java

    @Data
    public class AirRankingReq extends CommonReq{
        private String[] siteNumber;
        /** 站点类型 */
        private String siteType;
        /** 区域 */
        private String belongingRegion;
    
        private String sqlin;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
     String[] arr = Arrays.stream(commonReq.getSiteNumber()).toArray(String[]::new);
    
    • 1

    可以看到修改arr过后没有改变siteNumber的值,通过Aarrys.stream()创建了一个新的数组对象赋值给了arr

    在这里插入图片描述

  • 相关阅读:
    I/O多路复用详解
    《七月集训》第二十八日——动态规划
    数据结构题 3(一元多项式计算器)
    MindOpt有关于Python的建模与优化
    SpringBoot与安全(Spring security)
    合规性管理如何帮助产品团队按时交付?
    Roson的Qt之旅#104 QML Image控件
    【效率提升】Edge浏览器
    2024年全网最全的Jmeter+ant+jenkins实现持续集成教程
    不使用脚手架构建vue项目
  • 原文地址:https://blog.csdn.net/qq_45752401/article/details/125809636