在数组中多次存储相同的引用项,一次更改会影响它们吗?

时间:2012-02-17 07:30:23

标签: java arrays performance arraylist

我的mergesort算法有一些奇怪的运行时间...我想在同一个置换的ArrayList上运行算法(比如说1000次)。现在,我只是创建一个大小为1000的ArrayList数组,然后计算对每个数组进行排序所需的时间,然后取平均值。

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

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

4 个答案:

答案 0 :(得分:1)

  

如果我在数组中更改ArrayList中的一个实例,比如索引0,那么数组中的其他ArrayLists是否会保持不变?

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

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

ArrayList[] arr = new ArrayList[2];
ArrayList aList = new ArrayList();

arr[0] = aList;
arr[1] = aList;

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

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

arr[0] = aList1;
arr[1] = aList2;

因此,请确保代码中的Scenerio 2。

编辑:

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
}

您正在为每个索引添加相同的引用。因此,在任何索引处修改都会影响剩余的索引。

答案 1 :(得分:0)

是的,其他ArrayList将保持不变 例如。

array[0].set(0,object) 

不会影响ArrayList

处的array[1]

答案 2 :(得分:0)

你说你创建了一个ArrayLists数组,但是你为该数组中的每个插槽分配了什么?您是否创建了一个ArrayList实例并将其分配给阵列中的所有1000个插槽,或者您是否创建了1000个不同的ArrayLists(例如,在循环中使用new)并为每个阵列插槽分配不同的一个?

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

答案 3 :(得分:0)

如果你只是创建一个ArrayList对象数组,那么它们都是null。如果然后遍历数组并使用new实例化每个ArrayList,那么它们都是不同的(每次调用new ArrayList()都会创建一个新的。)

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