如何更改返回给方法的ArrayList? - Java

时间:2017-11-20 19:10:22

标签: java arraylist methods

这就是代码:

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

public class Test {
    public static void main(String[]args) {
        changeList();

        System.out.println(Arrays.toString(example().toArray()));
    }

    public static void changeList() {
        example().set(2, "Hi!");
    }

    public static List<String> example () {

        String str = new String("word1|word2|word3|word4|word5");

        return Arrays.asList(str.split("\\|"));
    }
}

我希望ArrayList如下所示:[word1, word2, Hi!, word4, word5]
但它没有改变......它打印[word1, word2, word3, word4, word5]

甚至可以这样改变吗? 提前谢谢!

4 个答案:

答案 0 :(得分:1)

问题在于example每次调用都会给出一个全新的List。当您在changeList中创建列表时,它与您在List中创建的列表不同main,对一个List所做的更改不会影响另一个。{/ p>

解决此问题的一种方法是:

  1. changeList方法执行上述操作:接受List(而不是从头开始生成)并更改List
  2. main方法传递到ListchangeList
  3. public static void main(String[]args) {
        List<String> list = example();
        changeList(list);
    
        System.out.println(Arrays.toString(list.toArray()));
    }
    
    public static void changeList(List<String> list) {
        list.set(2, "Hi!");
    }
    

答案 1 :(得分:0)

  

但它没有改变......是否有可能以这种方式改变它?

是的,您更改了列表但是丢失了返回集合的引用,因为方法public E set(int index, E element)返回E而不是列表本身..请参阅doc

正如我所说,将example()的返回移动到一个你可以操作的变量......

public static void main (String[] args) {
    List<String> retVal = example();
    System.out.println(retVal);
    retVal.set(2, "Hi!");
    System.out.println(retVal);
}

public static List<String> example () {
    String str = new String("word1|word2|word3|word4|word5");
    return Arrays.asList(str.split("\\|"));
}

答案 2 :(得分:0)

    public static void main(String[]args) {
        System.out.println(Arrays.toString(changeList().toArray()));
    }

    public static List<String>  changeList() {
        List<String> list = example();
        list.set(2, "Hi!");
        return list;
    }

    public static List<String> example () {

        String str = new String("word1|word2|word3|word4|word5");

        return Arrays.asList(str.split("\\|"));
    }

答案 3 :(得分:0)

让我们一次一行地执行您的代码,以了解它正在做什么:

 public static void main(String[]args) {
    changeList();

这会调用changeList()方法:

public static void changeList() {
    example().set(2, "Hi!");

首先致电example()

public static List<String> example () {
    String str = new String("word1|word2|word3|word4|word5");
    return Arrays.asList(str.split("\\|"));
}

这会创建一个新的List并将其返回changeList()

example().set(2, "Hi!");

现在我们通过将索引2处的元素设置为List来修改返回的"Hi!"。但是,修改后的列表会立即被丢弃,因为您不再引用它。

然后我们返回main:

    System.out.println(Arrays.toString(example().toArray()));

现在我们再次调用示例:

public static List<String> example () {
    String str = new String("word1|word2|word3|word4|word5");
    return Arrays.asList(str.split("\\|"));
}

这会创建List 。这个新列表与我们上一次调用example()时创建的列表无关。

如果您想保留相同的列表,则需要将其分配给changeList()中的引用,然后将其返回:

public static void changeList() {
    List<String> theList = example();
    theList.set(2, "Hi!");
    return theList;
}

现在main()需要保存对changeList()返回的列表的引用:

public static void main(String[]args) {
    List<String> mainList = changeList();

    System.out.println(mainList);
}

(注意:您可以直接打印List。原始版本比必要复杂得多。)