今天不知道怎么的,被人测出了数据异常(写完自己测过是没有问题,现在不知道怎么就有问题了,不过也确实是有问题。不仔细看还真忽略的,在此记录一下)
AirRankingReq.java
@Data
public class AirRankingReq extends CommonReq{
private String[] siteNumber;
/** 站点类型 */
private String siteType;
/** 区域 */
private String belongingRegion;
private String sqlin;
}
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;
}
将集合转成数组赋值给arr
String[] arr = commonReq.getSiteNumber().toArray(new String[0]);
可以看到成功的不影响siteNumber的值,它们所指向的地址不同了

不需要一个使用集合一个使用数组,直接使用Arrays.stream()
AirRankingReq.java
@Data
public class AirRankingReq extends CommonReq{
private String[] siteNumber;
/** 站点类型 */
private String siteType;
/** 区域 */
private String belongingRegion;
private String sqlin;
}
String[] arr = Arrays.stream(commonReq.getSiteNumber()).toArray(String[]::new);
可以看到修改arr过后没有改变siteNumber的值,通过Aarrys.stream()创建了一个新的数组对象赋值给了arr
