为什么我的原始列表阵列被修改



为什么当我致电

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;
    }
}

ArrayList<String> newList = aList;没有创建新列表。它创建了对同一列表的新引用。

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

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

thx @jb nizet这要简单得多:

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

当您说ArrayList<String> 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.

在此处查看收集API

最新更新