Java 添加多个“;“随机生成”;将对象添加到ArrayList会导致多次添加同一对象

Java 添加多个“;“随机生成”;将对象添加到ArrayList会导致多次添加同一对象,java,arraylist,shuffle,random,Java,Arraylist,Shuffle,Random,我有一个类Ttp,它有一个从文件加载的ArrayList。在Ttp的构造函数中,我随机洗牌从文件中读取的列表,并将其分配给对象 public class Ttp { private ArrayList<City> cities; public Ttp() { cities = Utils.shuffleArray(Loader.getCities()); } } 洗牌功能: public static <T> ArrayList

我有一个类
Ttp
,它有一个从文件加载的
ArrayList
。在
Ttp
的构造函数中,我随机洗牌从文件中读取的列表,并将其分配给对象

public class Ttp {
    private ArrayList<City> cities;

    public Ttp() {
        cities = Utils.shuffleArray(Loader.getCities());
    }
}
洗牌功能:

public static <T> ArrayList<T> shuffleArray(ArrayList<T> arrayList) {
    if (arrayList != null && arrayList.size() > 0) {
        int numberOfRolls = Random.getGenerator().nextInt((arrayList.size() - arrayList.size() / 3) + 1) + arrayList.size() / 3;
        int indexA;
        int indexB;
        T objectA;
        for (int i = 0; i < numberOfRolls; i++) {
            indexA = Random.getGenerator().nextInt(arrayList.size());
            indexB = Random.getGenerator().nextInt(arrayList.size());
            objectA = arrayList.get(indexA);
            arrayList.set(indexA, arrayList.get(indexB));
            arrayList.set(indexB, objectA);
        }
    }
    return arrayList;
}
如果
Loader.getCities()
每次都返回相同的列表,这意味着
shufflearlay()
会反复洗牌相同的列表,并且每个
Ttp.cities
都会引用相同的单一列表

解决办法是在某处复制一份。它可以位于
getCities()
中,也可以位于
shufflearlay()
中,或者位于
Ttp
构造函数中:

cities = Utils.shuffleArray(new ArrayList<>(Loader.getCities()));
cities=Utils.shufflearlay(新的ArrayList(Loader.getCities());
public static <T> ArrayList<T> shuffleArray(ArrayList<T> arrayList) {
    if (arrayList != null && arrayList.size() > 0) {
        int numberOfRolls = Random.getGenerator().nextInt((arrayList.size() - arrayList.size() / 3) + 1) + arrayList.size() / 3;
        int indexA;
        int indexB;
        T objectA;
        for (int i = 0; i < numberOfRolls; i++) {
            indexA = Random.getGenerator().nextInt(arrayList.size());
            indexB = Random.getGenerator().nextInt(arrayList.size());
            objectA = arrayList.get(indexA);
            arrayList.set(indexA, arrayList.get(indexB));
            arrayList.set(indexB, objectA);
        }
    }
    return arrayList;
}
public class Random {
    private static final java.util.Random generator = new java.util.Random();

    public static java.util.Random getGenerator() {
        return generator;
    }
}
cities = Utils.shuffleArray(new ArrayList<>(Loader.getCities()));