栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java中的List是引用传递

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java中的List是引用传递

今天遇到一个小bug,在service中调用了一个校验接口,却把我Service中入参的列表都清空了。最后找到原因竟然是忽视了List是引用传递。

在这里我写了一个例子,用于模仿当时的情况,当时入参比较复杂,这里仅仅表达出引用传递的效果。

实体类FromA 作为ServiceA方法的的入参:



public class FromA {

    private Integer id;

    private String name;

    private List games;

    
    public void init(){

        id = 1;
        name = "wz";
        List gameList = new ArrayList<>();
        gameList.add("荒野大镖客");
        gameList.add("双人成行");
        gameList.add("GTA5");
        gameList.add("只狼");
        games = gameList;
    }


}

实体类FromB 作为ServiceB的方法入参

public class FromB {

    private List downLoadGames;

}
问题复现

虽然ServiceB中方法的参数是fromb,但是fromA中的值也改变了。

public class ServiceB {

    public void removeGames(FromB downLoadGames){
        //获取已安装的游戏
        List 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中的数据。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1024703.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号