关于值传递和引用传递的问题记录

目录

[1. 问题概述](#1. 问题概述)

[1.1 测试](#1.1 测试)

[1.2 结果](#1.2 结果)

[2. ArrayList和Arrays.ArrayList](#2. ArrayList和Arrays.ArrayList)


1. 问题概述

最近忙着写论文很久没更新了,趁现在有时间简单记录一下最近遇到的一个坑。

对于Java中的List<>类型的对象,按我以前理解是引用传递,但有一点要注意,就是在调用方法里面如果直接将一个新的List对象赋值于该方法参数,会导致变成值传递,因为这个操作直接修改了方法参数的引用地址,无论怎么修改都无法影响到调用方法的对象。

1.1 测试

先看看下面的代码,简单来说就是通过handleList方法更新sourceList。

java 复制代码
public static void handleList1(List<String> sourceList) {
        System.out.println("handleList1");
        List<String> tempList = new ArrayList<>();
        for(String item: sourceList) {
            if(item.equals("EEEEE")) {
                // can't change sourceList directly
                tempList.add("E");
            } else {
                tempList.add(item);
            }
        }
        sourceList = tempList;
    }

    public static void handleList2(List<String> sourceList) {
        System.out.println("handleList2");
        List<String> tempList = new ArrayList<>();
        for(String item: sourceList) {
            if(item.equals("EEEEE")) {
                // can't change sourceList directly
                tempList.add("E");
            } else {
                tempList.add(item);
            }
        }
        sourceList.clear();
        sourceList.addAll(tempList);
    }

通过以下方法测试:

java 复制代码
public static void main(String[] args) {

        // 1
        List<String> sourceList = new ArrayList<String>(){{add("A"); add("B"); add("C"); add("D");add("EEEEE");}};
        handleList1(sourceList);
        System.out.println(sourceList);

        // 2
        sourceList = new ArrayList<String>(){{add("A"); add("B"); add("C"); add("D");add("EEEEE");}};
        handleList2(sourceList);
        System.out.println(sourceList);
    }

1.2 结果

上面可以发现handleList1方法并没有成功修改sourceList的值,因为重新为sourceList赋予了新的地址,永远不会改变原来地址空间的sourceList。

但其实如果idea用的是专业版的话就可以直接发现这个bug,但是当时用的社区版没提示一着急就踩坑了。

2. ArrayList和Arrays.ArrayList

顺便提一下,因为上面的要求需要修改List的内容,line26不能直接修改for循环的sourceList内容,

同时如果List是Arrays.ArrayList的实例,那么不支持add(); clear(); addAll();这些操作,

不然都会报UnsupportedOperationException。

所以如果需要将数组转成List,可以这样:

java 复制代码
List list = new ArrayList<>(Arrays.asList("A", "B", "C"))

更多方式可以参考:List操作add,clear,addall

相关推荐
sg_knight9 分钟前
Spring Cloud Gateway全栈实践:动态路由能力与WebFlux深度整合
java·spring boot·网关·spring·spring cloud·微服务·gateway
JosieBook22 分钟前
【IDEA】IntelliJ IDEA 中文官方文档全面介绍与总结
java·ide·intellij-idea
三只蛋黄派24 分钟前
Websocket
java
JIngJaneIL29 分钟前
专利服务系统平台|个人专利服务系统|基于java和小程序的专利服务系统设计与实现(源码+数据库+文档)
java·数据库·小程序·论文·毕设·专利服务系统平台
崎岖Qiu32 分钟前
leetcode1343:大小为K的子数组(定长滑动窗口)
java·算法·leetcode·力扣·滑动窗口
freed_Day41 分钟前
Java学习进阶--集合体系结构
java·开发语言·学习
zuozewei1 小时前
高可用改造之构建双活冗余的TDengine时序数据处理架构
java·架构·tdengine
嫩萝卜头儿1 小时前
从零掌握 Java AWT:原理、实战与性能优化
java·开发语言·性能优化
都叫我大帅哥2 小时前
Java ZGC垃圾收集器:低延迟的终极武器,全面解析与实战指南
java·jvm
Jason?132 小时前
Unity基于Recoder的API写了一个随时录屏的工具
java·unity·游戏引擎