Java 在数组中多次存储同一引用项,一次更改是否会影响所有引用项?

Java 在数组中多次存储同一引用项,一次更改是否会影响所有引用项?,java,arrays,performance,arraylist,Java,Arrays,Performance,Arraylist,我得到了一些奇怪的运行时间为我的mergesort算法…我想运行算法(说1000次)在同一个排列ArrayList。现在,我只是创建一个大小为1000的ArrayList数组,然后计算每个数组的排序时间,然后计算平均时间 所以我的问题是:我是否在一遍又一遍地对同一个列表进行排序?如果我更改数组中ArrayList的一个实例,比如在索引0处,数组中的其他ArrayList会保持不变吗?我想是的,但我想确定这不会发生?谢谢 for (int N = 1000; N <= 10000;

我得到了一些奇怪的运行时间为我的mergesort算法…我想运行算法(说1000次)在同一个排列ArrayList。现在,我只是创建一个大小为1000的ArrayList数组,然后计算每个数组的排序时间,然后计算平均时间

所以我的问题是:我是否在一遍又一遍地对同一个列表进行排序?如果我更改数组中ArrayList的一个实例,比如在索引0处,数组中的其他ArrayList会保持不变吗?我想是的,但我想确定这不会发生?谢谢

    for (int N = 1000; N <= 10000; N += 1000) {

      //copy the array
      @SuppressWarnings("unchecked")
      ArrayList<Integer>[] container = (ArrayList<Integer>[])new ArrayList[N];
      ArrayList<Integer> testArray1 = generatePermutedOrder(N);
      for(int j=0; j<timesToLoop; j++){
        container[j] = testArray1;
      }

      System.out.print(N + "\t");

      // let things stabilize
      startTime = System.nanoTime();
      while (System.nanoTime() - startTime < 1000000000)
        ;

      // time the routine
      startTime = System.nanoTime();
      for (int i = 0; i < timesToLoop; i++) {
          mergesort(container[i]);
      }

for(int N=1000;NYes另一个
ArrayList
将保持不变。
比如说

array[0].set(0,object) 
不会影响
array[1]

如果我更改数组中ArrayList的一个实例,比如在索引0处,数组中的其他ArrayList会保持不变吗

是,修改索引0处的ArrayList不会影响其他索引。(但请确保其他索引没有对同一ArrayList的引用)

场景1:(修改索引0将影响索引1)

场景2:(修改索引0不会影响索引1)

所以,请确保代码中是Scenerio 2

编辑:

ArrayList testArray1=generatePermutedOrder(N);

对于(int j=0;j您说过您创建了一个ArrayList数组,但是您为该数组中的每个插槽分配了什么?您是创建了一个ArrayList实例并将其分配给数组中的所有1000个插槽,还是创建了1000个不同的ArrayList(例如,在循环中使用
new
)并为每个数组插槽分配了不同的ArrayList


如果将对同一对象的多个引用存储在多个位置,则对该对象的更改将通过所有引用可见。

如果仅创建ArrayList对象数组,则这些对象都为空。如果随后迭代数组并使用new实例化每个ArrayList,则它们都是不同的(每次调用new ArrayList)()将创建一个新的)


通过创建ArrayList,然后在数组中迭代,并为数组的每个元素分配(已创建的)ArrayList的值,可以在数组的每个元素中放置相同的ArrayList引用。这可能不是您想要做的。

如果您使用相同的ArrayList对象(一个
新ArrayList),则是()
)然后所有操作都将在同一个对象上完成。幸运的是,复制一个副本很简单-构造函数/addAll。是的,我想我可能会遇到问题。如何在不声明1000个不同的ArrayList的情况下高效地执行案例2(显然无法手动执行)?如果
ArrayList
的内容是相同的,为什么要一次又一次地
mergesort
呢?我想运行多次,这样我就可以得到一个平均时间。只运行一次并不一定代表平均情况。不过,我的教授说我需要这么做……所以,不要创建太多
ArrayList
在开始处。在每次交互中,将原始文件复制到新文件,然后传递到
mergesort
ArrayList[] arr = new ArrayList[2];
ArrayList aList = new ArrayList();

arr[0] = aList;
arr[1] = aList;
ArrayList[] arr = new ArrayList[2];
ArrayList aList1 = new ArrayList();
ArrayList aList2 = new ArrayList();

arr[0] = aList1;
arr[1] = aList2;
ArrayList<Integer> testArray1 = generatePermutedOrder(N);       
for(int j=0; j<timesToLoop; j++)
{         
    container[j] = testArray1; // same reference pointing to same ArrayList is added in each interation
}