Java List<String> パラメータを渡して値を返さない方法の解決策

Java の List メソッドでパラメータを渡し、値を返さないという解決策は、今日、魔法の問題に遭遇しました. Java メソッドで List が渡され、メソッドでそれに値が割り当てられました. 返す前に値があることを確認してください.メソッドへ。メソッド外では使用できません。


今日は不思議な問題に遭遇しました.JavaのメソッドにListを渡してメソッド内で値を代入している.メソッドに戻る前に値があることを確認し,メソッドの外では取得できない.

1. 質問

Java メソッドはパラメータ リストを渡し、値はメソッド内で正常に変更されますが、返された後に値が取得されません。

2. 原因と解決策

理由: ここの newList は新しいもので、新しいメモリの断片ですが、stringList のアドレスはメソッド内の newList を指しているため、メソッド内で stringList を使用する値は newList であり、メソッド内のスコープが終了すると、 、newListは破棄され、stringListはnewListの値とは関係がないため、アドレスが渡されていないようです。

解決策: 1. メソッド内の List.addAll; 2. 戻り値はリスト; 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;
    }
}

参考

おすすめ

転載: blog.csdn.net/qq_40985985/article/details/130226076