【问题标题】:Is it possible to create an independent copy of an integer arraylist in java?是否可以在 java 中创建整数数组列表的独立副本?
【发布时间】:2017-04-07 13:07:40
【问题描述】:

我尝试了很多方法,但是如果我对一个副本进行任何更改,这些更改会反映在另一个副本中。我也尝试过深拷贝,但没有结果,请帮忙。

我的深拷贝方法:

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

Small Change:这是对复制的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;        
}

【问题讨论】:

  • 其中一个的变化不可能反映在另一个中:整数对象是不可变的:stackoverflow.com/questions/4117793/…
  • @PatrickFerreira 不存在ArrayList&lt;int&gt;
  • 这并不痛苦。 new ArrayList&lt;Integer&gt;(list) 是复制列表所需的全部内容。
  • @efekctive 不变性确实与 更改 是否可以反映在其他引用中有关。
  • @RishiKapadia 关于更新:您正在修改旧的 arrayList,我不知道您在期待什么

标签: java arraylist


【解决方案1】:

试试 Collections.copy 方法。

public static void copy(List dest, List src)

【讨论】:

    【解决方案2】:

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

    你可以这样做:

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

    【讨论】:

    【解决方案3】:

    如果我了解您真正想要做什么(创建一个带有随机小变化的新 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);
         }
    }
    

    【讨论】:

      【解决方案4】:

      您可以使用 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;
          }
      

      【讨论】:

        猜你喜欢
        • 2018-11-30
        • 2021-10-22
        • 2014-10-07
        • 1970-01-01
        • 1970-01-01
        • 2018-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多