Java中的List是引用传递
Posted 结构化思维wz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的List是引用传递相关的知识,希望对你有一定的参考价值。
今天遇到一个小bug,在service中调用了一个校验接口,却把我Service中入参的列表都清空了。最后找到原因竟然是忽视了List是引用传递。
在这里我写了一个例子,用于模仿当时的情况,当时入参比较复杂,这里仅仅表达出引用传递的效果。
实体类FromA
作为ServiceA方法的的入参:
/**
* @ClassName: FromA
* @Description:
* @author: WangZe
* @date: 2022/7/21 21:34
*/
public class FromA
private Integer id;
private String name;
private List<String> games;
/**
* 初始化入参
*/
public void init()
id = 1;
name = "wz";
List<String> gameList = new ArrayList<>();
gameList.add("荒野大镖客");
gameList.add("双人成行");
gameList.add("GTA5");
gameList.add("只狼");
games = gameList;
实体类FromB
作为ServiceB的方法入参
public class FromB
private List<String> downLoadGames;
问题复现
虽然ServiceB中方法的参数是fromb,但是fromA中的值也改变了。
public class ServiceB
public void removeGames(FromB downLoadGames)
//获取已安装的游戏
List<String> downLoadGames1 = downLoadGames.getDownLoadGames();
//超过两个游戏,卸载索引为一的
if (downLoadGames1.size()>2)
downLoadGames1.remove(1);
public class ServiceA
/**
* 模拟调用
*/
public void clear(FromA from)
FromB fromB = new FromB();
fromB.setDownLoadGames(from.getGames());
ServiceB serviceB = new ServiceB();
serviceB.removeGames(fromB);
public class Main
public static void main(String[] args)
ServiceB serviceB = new ServiceB();
ServiceA serviceA = new ServiceA();
FromA fromA = new FromA();
fromA.init();
serviceA.clear(fromA);
System.out.println("fromA.getGames() = " + fromA.getGames());
结果:
fromA.getGames() = [荒野大镖客, GTA5, 只狼]
问题分析
通过debug可以发现:
FromA中List的地址为 489
FromB中List的地址也是489
所以downLoadGames中的数据发生变化,也就是489地址中的数据发生了变化,也就影响力FromA中的数据。
以上是关于Java中的List是引用传递的主要内容,如果未能解决你的问题,请参考以下文章
荒野大镖客2救赎 PC中文游戏 steam正版 Red Dead Redemption 2 大镖客2 大表哥2 赏金猎人-1元优