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


    目录

    1. 问题概述

    1.1 测试

    1.2 结果

    2. ArrayList和Arrays.ArrayList


    1. 问题概述

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

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

    1.1 测试

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

    1. public static void handleList1(List sourceList) {
    2. System.out.println("handleList1");
    3. List tempList = new ArrayList<>();
    4. for(String item: sourceList) {
    5. if(item.equals("EEEEE")) {
    6. // can't change sourceList directly
    7. tempList.add("E");
    8. } else {
    9. tempList.add(item);
    10. }
    11. }
    12. sourceList = tempList;
    13. }
    14. public static void handleList2(List sourceList) {
    15. System.out.println("handleList2");
    16. List tempList = new ArrayList<>();
    17. for(String item: sourceList) {
    18. if(item.equals("EEEEE")) {
    19. // can't change sourceList directly
    20. tempList.add("E");
    21. } else {
    22. tempList.add(item);
    23. }
    24. }
    25. sourceList.clear();
    26. sourceList.addAll(tempList);
    27. }

    通过以下方法测试:

    1. public static void main(String[] args) {
    2. // 1
    3. List sourceList = new ArrayList(){{add("A"); add("B"); add("C"); add("D");add("EEEEE");}};
    4. handleList1(sourceList);
    5. System.out.println(sourceList);
    6. // 2
    7. sourceList = new ArrayList(){{add("A"); add("B"); add("C"); add("D");add("EEEEE");}};
    8. handleList2(sourceList);
    9. System.out.println(sourceList);
    10. }

    1.2 结果

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

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

    2. ArrayList和Arrays.ArrayList

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

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

    不然都会报UnsupportedOperationException。

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

    List list = new ArrayList<>(Arrays.asList("A", "B", "C"))

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

  • 相关阅读:
    Python学习七(线程)
    Android10之Video MediaCodec硬解码流程(二十七)
    前后端解决跨域问题
    结合RF与1DCNN的多信息融合气温预报方法
    “源启2.0”:从自上而下的解构,到自下而上的重构
    java多线程基础技术
    排序算法详解(java代码实现)
    npm升级最新稳定版
    【GitHub】保姆级使用教程
    LeetCode-891. 子序列宽度之和【排序,数学,数组】
  • 原文地址:https://blog.csdn.net/BAStriver/article/details/134365678