JAVA引用传递导致的方法中重新赋值失败

2023-10-28

在工作中遇到需要对某些参数进行业务逻辑过滤处理,在原方法中过滤成功。将业务过滤代码抽成公共方法后,过滤失败。当时情况如下:

原代码:

public static void main(String[] args) {

    Boolean filter = true;
    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    if (filter) {
        List<Integer> collect = list.stream().filter(value -> value > 2).collect(Collectors.toList());
        list = collect;
    }else {
        List<Integer> collect = list.stream().filter(value -> value < 2).collect(Collectors.toList());
        list = collect;
    }
    System.out.println(list);
}

抽出业务代码为公共方法后:

public static void main(String[] args) {

    Boolean filter = true;
    List<Integer> test = new ArrayList<>();
    doFilter(filter, test);
    System.out.println(test);
}

private static void doFilter(Boolean filter, List<Integer> list) {
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    if (filter) {
        List<Integer> collect = list.stream().filter(value -> value > 2).collect(Collectors.toList());
        list = collect;
    }else {
        List<Integer> collect = list.stream().filter(value -> value < 2).collect(Collectors.toList());
        list = collect;
    }
}

如上所示,将业务抽成方法后过滤逻辑失效了,这个问题原因涉及到指针和java的引用传递。

mian 函数中的test 指向内存地址addr1,调用doFilter方法时test作为参数传进去,list参数也指向了addr1。在if 判断中,list 过滤出一个新的集合collect ,这时collect 的地址为addr2 ,执行list = collect 后,参数list 的值变成了我们理想中的值,但list 指向的地址为addr2,也就是说我们实际想要的值地址是addr2。而main 函数中test 的地址为addr1 。

要避免这种情况,就需要将list 参数作为函数返回值返回,将main 函数中的test 地址指向addr2。

public static void main(String[] args) {

    Boolean filter = true;
    List<Integer> test = new ArrayList<>();
    test = doFilter(filter, test);
    System.out.println(test);
}

private static List<Integer> doFilter(Boolean filter, List<Integer> list) {
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    if (filter) {
        List<Integer> collect = list.stream().filter(value -> value > 2).collect(Collectors.toList());
        list = collect;
    }else {
        List<Integer> collect = list.stream().filter(value -> value < 2).collect(Collectors.toList());
        list = collect;
    }
    return list;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA引用传递导致的方法中重新赋值失败 的相关文章

随机推荐

  • mysql 提交事务_MySQL事务提交过程

    一 MySQL事务提交过程 一 MySQL作为一种关系型数据库 已被广泛应用到互联网中的诸多项目中 今天我们来讨论下事务的提交过程 由于mysql插件式存储架构 导致开启binlog后 事务提交实质是二阶段提交 通过两阶段提交 来保证存储引
  • gcc头文件库文件搜索路径问题

    参考资料 http hi baidu com relayon blog item 95aaf7fcf8e3edf5fc037f89 html 我们编写程序的时候会用到三个东西 头文件 链接时候库文件 运行时动态库文件 对于上面3中 我认为头
  • Linux运维之pacemaker+corosync实现集群管理(负载均衡、配置fence服务)

    前言 高可用集群 是指以减少服务中断 如因服务器宕机等引起的服务中断 时间为目的的服务器集群技术 简单的说 集群就是一组计算机 它们作为一个整体向用户提供一组网络资源 这些单个的计算机系统就是集群的节点 高可用集群的出现是为了减少由计算机硬
  • google jib容器打包工具试用

    简介 Jib 是 Google 开发的可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库 以 Maven 和 Gradle 插件形式提供 通过 Jib Java 开发者可以使用他们熟悉的 Java 工具来构建容器 Jib
  • 20171009离线赛总结

    考试时的思路 第一题 直接枚举 正着循环 倒着循环 求出每个点对应的L和R 第二题 20 32 2017 10 9 看了半天 把所有可能的区间预处理出来 dfs 第三题 30分的话 用二进制枚举 看一条边取还是不取 可以先把链的写了 输入的
  • Cache replacement policies(缓存替换策略)/ LRU 和 LFU等算法

    缓存是一个计算机思维 对于重复的计算 缓存其结果 下次再算这个任务的时候 不去真正的计算 而是直接返回结果 能加快处理速度 当然有些会随时间改变的东西 缓存会失效 得重新计算 在计算中 缓存算法 通常也称为缓存替换算法或缓存替换策略 是优化
  • mPython入门指南--第2课:esptool刷写esp8266固件

    一 材料 1 win10 非ghost版 我的是 2 esp8266带ch340g串口模块 安装好串口驱动 并记下串口号 我的是COM4 二 刷固件过程 1 安装python2 此处敲黑板 只能是python2 因为esptool只支持py
  • Qt中的进度指示器实现——使用QProgressBar生成进度条

    Qt中的进度指示器实现 使用QProgressBar生成进度条 在Qt中 要实现一个进度指示器 Progress Indicator 我们可以使用QProgressBar类来生成一个进度条 QProgressBar是Qt提供的用于显示进度的
  • markdown文字编辑

    markdown字体类html代码简介 1 颜色 2 大小 3 字体 4 背景色 4 居中 颜色 在markdown中采用如下方式能够控制文字的颜色 浅红色文字 font color dd0000 浅红色文字 font br 深红色文字 f
  • 轻松编辑,惊艳构图 —《Pixelmator Pro》小技巧

    Pixelmator Pro的ML Machine Learning 裁剪是一项智能功能 可自动识别和裁剪图像中不需要的部分 使图片更美观 使用这个功能 用户只需要手动选择要保留的重要区域 然后Pixelmator Pro会使用机器学习算术
  • 算法复杂度分析,算法复杂度o(1), o(n), o(logn), o(nlogn) 时间复杂度On和空间复杂度O1是什么意思?

    https www cnblogs com TangBiao p 5856695 html https blog csdn net dazhaoDai article details 81631195 https www cnblogs c
  • BFS 迷宫问题+打印路径

    问题 定义一个二维数组N M 其中2 lt N lt 10 2 lt M lt 10 如5 5数组下所示 int maze 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 它表示一
  • pycharm无限制更新码

    http www lookdiv com 密码7788
  • SPI通讯的数据交互及图片显示

    这个项目耗时三个月 前两个月攻克技术难关 后一个月进行功能联调 也是我很长时间没有更新的原因 一个项目从初期的evt到最终的pvt 离不开大家的合作 从前期的prd核对到最终的项目交付 耗费了我大量心血 期间遇到的问题不计其数 所以说一个好
  • C语言数据结构篇——栈的顺序存储

    作者名 Demo不是emo 主页面链接 主页传送门创作初心 对于计算机的学习者来说 初期的学习无疑是最迷茫和难以坚持的 中后期主要是经验和能力的提高 我也刚接触计算机1年 也在不断的探索 在CSDN写博客主要是为了分享自己的学习历程 学习方
  • STL源码阅读-functor与adapter

    为什么要用仿函数 函数指针不灵活 难以与STL其他组件配合使用 Adapter 将一个class的接口转换为另一个class的接口 使原本因接口不兼容而不能合作的classes 可以一起运作 STL中的adapter function ad
  • LocalDateTime、LocalDate、LocalTime与Date对比

    Java8以前 我们一直长期使用Date和Calendar来处理时间 而在使用Date处理日期时间问题上会存在一定的隐患 产生线程不安全的问题 最典型的就是在一定负载并发量的情况下使用SimpleDateFormat引发的线程安全性问题 如
  • strcpy_s不接受两个参数的问题

    char p new char 25 strcpy s p 20 wenmingjie 才能成功运行 而strcpy s p wenmingjie 不能 同理 strname char new char strlen str 1 strcp
  • win32 x64 x86 区别

  • JAVA引用传递导致的方法中重新赋值失败

    在工作中遇到需要对某些参数进行业务逻辑过滤处理 在原方法中过滤成功 将业务过滤代码抽成公共方法后 过滤失败 当时情况如下 原代码 public static void main String args Boolean filter true