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


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

    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

    在这里插入图片描述

  • 相关阅读:
    Compose 编译器版本和Kotlin版本对应关系
    springboot项目使用validated参数校验框架
    【Linux升级之路】6_进程间通信
    叫人头疼的diff算法原理
    说说HBase Region核心切分流程?
    Redis05:Redis高级部分
    vue非常实用的几行代码【日期处理、字符串处理、数组处理、颜色操作】
    【STM32学习】工程模板&跑马灯
    238. 除自身以外数组的乘积 (前缀和)
    2023年天津市大学软件学院专升本专业课报名缴费考试的通知
  • 原文地址:https://blog.csdn.net/qq_45752401/article/details/125809636