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元优

不止《荒野大镖客》,Steam上的西部题材游戏还有这些

STEAM 游戏折扣steam新年折扣开启!荒野大镖客2折后133!

Java中的List是引用传递

Java中的List是引用传递

安装MacOS对PC配置要求如何?