热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

List--方法内的list传递给入参后方法外获取不到的原因和解决办法

我们经常使用List来做数据集合存放数据,经常使用时我们知道list是可以实现地址传递,也就是在list通过方法的入参传递到方法内后,整个list的值可以在方法内使用:通过add方法可以

我们经常使用List来做数据集合存放数据,经常使用时我们知道list是可以实现地址传递,也就是在list通过方法的入参传递到方法内后,整个list的值可以在方法内使用:

通过add方法可以在原来的基础上增加新值,

也可以通过set(index,值)的方式改变原来index位置的数据

而且入参传递的值经过add、set等后再方法外也是生效的,就是这个操作后的值,这就是地址传递,也就是对象传递。

但是,我们容易忽略的一点儿是:

当在方法内发生新的list整体赋值给入参的list的时候(例如例子里的stringList = newList;), 这样对入参的修改,方法外获取不到,似乎上就不是地址传递了。

其实,原因是,这里的newList是new过的,是新的内存的一块,只是在方法内将stringList的地址指向了newList,所以方法内我们使用stringList的值就是newList的,而一旦方法内的作用域结束后,newList被销毁,stringList就和newList值无关了,所以就似乎不是地址传递了。

解决办法:

那我们怎么实现方法内的new的list传递给方法外呢?

1.可以作为方法的返回值,将新new的list作为值,return到方法外。

2.但是我们在实际开发中经常返回值还有其他作用,例如已经被boolean表示操作成功失败的的返回信息占用,我们必须要实现入参传递的list将新的list带出去。
使用list提供的addAll方法,很好的处理了这个问题。(
在我没注意到addAll方法前,我首先我想到clone方法,但是List不支持clone方法,而addAll方法很好用,也就没必要clone)

以下是在IDE上测试的各种情况,可以使用哟:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 对list的各种赋值方式的测试
 *   找到整体新的list赋值传递到方法外仍然有效的的方法 addAll
 * @author zml
 * @date 2018/3/20
 */
public class TestList {
    public static void main(String[] args) {
        TestList test = new TestList();

        List stringList1 = new ArrayList<>();
        test.addList(stringList1);
        System.out.println("长度是" + stringList1.size());//1

        List stringList2 = new ArrayList<>();
        test.equalList(stringList2);
        System.out.println("长度是" + stringList2.size());//0

        List stringList3 = new ArrayList<>();
        test.arrayAsList(stringList3);
        System.out.println("长度是" + stringList3.size());//0

        List stringList4 = new ArrayList<>();;
        test.newArrayAsList(stringList4);
        System.out.println("长度是" + stringList4.size());//2

        List stringList5 = new ArrayList<>();;
        stringList5 = test.returnList();
        System.out.println("长度是" + stringList5.size());//2
    }

    /**
     * add方法往入参的list传值
     *   地址传递,有效
     * @param stringList list
     */
    public void addList(List stringList) {
        stringList.add("add");
    }

    /**
     * 方法内的new的list赋值给入参的list
     *   方法外无效
     * @param stringList list
     */
    public void equalList(List stringList) {
        List newList = new ArrayList<>();
        newList.add("new");

        stringList = newList;
    }

    /**
     * 数组通过Arrays.asList方法转化为list赋值给入参的list
     *   方法外无效 Arrays.asList的实现机制是new
     * @param stringList list
     */
    public void arrayAsList(List stringList) {
        String[] arrayStr = {"arrayStr1", "arrayStr2"};
        List newList = Arrays.asList(arrayStr);
        stringList = newList;
    }

    /**
     * 使用list的addAll方法将new的list传递给入参list
     *  addAll是list提供的用于整体赋值list的方法,相当于将每项取出来多次遍历去add
     * @param stringList list
     */
    public void newArrayAsList(List stringList) {
        String[] arrayStr = {"arrayStr1", "arrayStr2"};
        List newList = Arrays.asList(arrayStr);
        stringList.addAll(newList);
        //List不支持clone方法,但是addAll很好用
    }

    /**
     * 方法内的list做返回值返回到方法外
     */
    public List returnList() {
        String[] arrayStr = {"arrayStr1", "arrayStr2"};
        List newList = Arrays.asList(arrayStr);
        return newList;
    }
}


推荐阅读
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • importjava.util.ArrayList;publicclassPageIndex{privateintpageSize;每页要显示的行privateintpageNum ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
author-avatar
豆豆马捷
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有