是否可以在java中创建整数arraylist的独立副本?

时间:2017-04-07 13:07:41

标签: java arraylist

我尝试过多种方式但是如果我对一个副本进行任何更改,那么这些更改会反映在另一个副本中。我也试过深度复制,没有结果请帮忙。

我的深层复制方法:

public static ArrayList<Integer> cloneList(ArrayList<Integer> list) {
    ArrayList<Integer> clone = new ArrayList<Integer>(list.size());
    for (int i=0;i<list.size();i++){
        clone.add(list.get(i));
    }       
    return clone;
}

小变化:这是对复制的arraylist进行更改时使用的方法

public static ArrayList<Integer>smallChange(ArrayList<Integer>oldArray){
    int firstNo;
    int secondNo;

    do{
        Random rand1 = new Random();
        Random rand2 = new Random();
        firstNo = (int) Math.abs(matrix_length*rand1.nextDouble());
        System.out.println("A: "+firstNo);
        secondNo = (int) Math.abs(matrix_length*rand2.nextDouble());
        System.out.println("B: "+secondNo);

    }while(firstNo == secondNo);


    int temp1 = oldArray.indexOf(firstNo);
    int temp2 = oldArray.indexOf(secondNo);

    oldArray.set(temp1, secondNo);
    oldArray.set(temp2,firstNo);
    ArrayList<Integer> newArrayList = oldArray;             

    return newArrayList;        
}

4 个答案:

答案 0 :(得分:0)

  

是否可以创建整数数组列表的独立副本   在java?

你可以这样做:

public static ArrayList<Integer> cloneList(ArrayList<Integer> list) {
      return new ArrayList<Integer>(list);
}

答案 1 :(得分:0)

尝试使用Collections.copy方法。

public static void copy(List dest, List src)

答案 2 :(得分:0)

如果我理解你真正要做的事情(创建一个随机小改动的新ArrayList),问题是你正在修改原始列表然后克隆它。 假设这是一个解决方案:

public static ArrayList<Integer> smallChange(ArrayList<Integer> oldArray) {
    int firstNo;
    int secondNo;

    do {
        Random rand1 = new Random();
        Random rand2 = new Random();
        firstNo = (int) Math.abs(matrix_length*rand1.nextDouble());
        System.out.println("A: "+firstNo);
        secondNo = (int) Math.abs(matrix_length*rand2.nextDouble());
        System.out.println("B: "+secondNo);

    } while(firstNo == secondNo);

    ArrayList<Integer> newArrayList = new ArrayList<>(oldArray);
    int temp1 = newArrayList.indexOf(firstNo);
    int temp2 = newArrayList.indexOf(secondNo);

    newArrayList.set(temp1, secondNo);
    newArrayList.set(temp2,firstNo);    
    return newArrayList;        
}

这是一个复制列表然后修改副本的例子:

import java.util.*;

public class HelloWorld{

     public static void main(String []args){
        List<Integer> list1= new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        List<Integer> list2= new ArrayList<>(list1);
        list2.set(1,6);
        System.out.println(list1);
        System.out.println(list2);
     }
}

答案 3 :(得分:-1)

您可以使用Collections类的unmodifiableList方法,它至少会停止在列表对象中的修改,该列表对象在Collections类的unmodifiableList方法中作为参数传递。

public List<String> getList(List<String> alist) {
        List<String> list = new ArrayList<String>(alist);
        List<String> unmodifiableList = Collections.unmodifiableList(list);

        return unmodifiableList;
    }