Java List<String> 方法内传参,无法返回值的解决办法

Java List 方法内传参,无法返回值的解决办法 今天遇到个神奇的问题,Java方法中传了一个List ,在方法中对其赋值,确认在返回该方法前是有值的,在方法外获取不到。


今天遇到个神奇的问题,Java方法中传了一个List ,在方法中对其赋值,确认在返回该方法前是有值的,在方法外获取不到。

1. 问题

Java 方法传参数list,方法内成功修改值,但返回后未获取到值。

2. 原因及解决

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

解决: 1. 方法内list.addAll; 2. 返回值为list; 3. 方法内list.add();

3. 源码

package com.utils;

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

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

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

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

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

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

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

        // 解决办法·3
        List<String> stringList5 = new ArrayList<>();
        stringList5 = test.returnList();
        System.out.println("长度是" + stringList5.size());//2
    }

    private void streamSet(List<String> stringList0) {
        String[] strings = "1,2,3,4,5".split(",");
        stringList0 = Arrays.stream(strings).collect(Collectors.toList());
    }

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

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

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

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

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

参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序媛一枚~

您的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值