【问题标题】:why is my original list array is getting modified为什么我的原始列表数组被修改
【发布时间】:2012-10-30 22:44:39
【问题描述】:

为什么当我打电话时

ArrayList<String> reversedList = ListUtils.reverse(list);

正在修改原始列表,即使我在方法中复制了它

package com.javablackbelt.utils;

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

public class ListUtils {

    public static void main(String arg[]) {
        String[] arr = {"one", "two", "three", "four", "five"};
        ArrayUtils.print(arr);

        System.out.println();

        String [] reversedArr = ArrayUtils.reverse(arr);
        ArrayUtils.print(reversedArr);

        System.out.println();

        ArrayList<String> list = ArrayUtils.toArrayList(arr);
        ListUtils.print(list);  

        ArrayList<String> reversedList = ListUtils.reverse(list);
        ListUtils.print(reversedList);

        String[] arrFromList = ListUtils.toArray(list);
        ArrayUtils.print(arrFromList);

    }

    public static void print(ArrayList<String> aStr) {
        System.out.print("list: [ ");
        for(String l: aStr)
            System.out.print(l+" ");
        System.out.println(" ] size: "+aStr.size());
    }

    public static ArrayList<String> reverse(ArrayList<String> aList) {
        ArrayList<String> newList = aList;

        Collections.reverse(newList);
        return newList;
    }

    public static String[] toArray(ArrayList<String> list) {
        ArrayList<String> newList = list;
        String[] newStr = newList.toArray(new String[list.size()]);

        return newStr;
    }

}

【问题讨论】:

  • 目前还不清楚您认为自己在哪里制作副本。你能帮我们缩小范围吗?

标签: java list reference


【解决方案1】:

ArrayList&lt;String&gt; newList = aList; 没有创建新列表。它创建对同一列表的新引用。

可以这样创建一个新列表:

ArrayList<String> newList = new ArrayList<String>(aList.size());
for (String str : aList)
    newList.add(str);

谢谢@JB 尼泽 这要简单得多:

ArrayList<String> newList = new ArrayList<String>(aList);

【讨论】:

  • 或者,更简单:List&lt;String&gt; newList = new ArrayList&lt;String&gt;(aList);
  • @JBNizet 哦,这样就可以创建一个新列表并将其复制到一行中......干得好
  • 是的。所有集合都有一个这样的复制构造函数,您可以通过阅读 javadoc 发现。
【解决方案2】:

当您说ArrayList&lt;String&gt; newList = aList; 时,您不是在创建新列表,而是将newList 指向aList。如果您不想修改现有列表,请创建一个新的 ArrayList 并将 aList 添加到该 newList 中。

public static ArrayList<String> reverse(ArrayList<String> aList) {
            ArrayList<String> newList= new ArrayList<>();
                     newList.addAll( aList);

            Collections.reverse(newList);
            return newList;
        }

编辑:

use Collections.copy(List dest, List src) to copy.

check here for Collections API

【讨论】:

  • 是否可以将 System.arraycopy() 与列表一起使用?像在数组中一样?...我尝试创建一个新的,然后使用 arraycopy 复制它,但我遇到了运行时错误
  • 您遇到了编译错误。数组和列表是不同类型的对象。您不能将 List 传递给提取数组的方法。只是你不能将 Apple 传递给期望 Orange 的方法。有一个叫做javadoc 的小有用的东西,它是免费提供的,它公开了JDK 中每个类的所有方法,以及它们的文档。阅读它。
猜你喜欢
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 2019-01-09
  • 1970-01-01
  • 2016-06-25
  • 2014-05-11
相关资源
最近更新 更多