Сохранять один и тот же элемент ссылки несколько раз в массиве, повлияет ли одно изменение на них всех? - PullRequest
0 голосов
/ 17 февраля 2012

Я получаю некоторые странные времена выполнения для моего алгоритма сортировки слиянием ... Я хочу запустить алгоритм (скажем, 1000 раз) для того же перестановочного ArrayList. Сейчас я просто создаю массив ArrayList размером 1000, затем время, необходимое для сортировки каждого из них, а затем среднее время.

Итак, мой вопрос: сортирую ли я один и тот же список снова и снова? Если я изменю один экземпляр 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]);
      }

Ответы [ 4 ]

1 голос
/ 17 февраля 2012

Если я изменю один экземпляр ArrayList в массиве, скажем, с индексом 0, другие ArrayList в массиве останутся такими же?

Да, изменение ArrayList с индексом 0 не повлияет на другие индексы. (но убедитесь, что другие индексы не имеют ссылки на тот же ArrayList)

Сценарий 1: (Изменение индекса 0 повлияет на индекс 1)

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

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

Сценарий 2: (Изменение индекса 0 НЕ повлияет на индекс 1)

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

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

Итак, убедитесь, что это Scenerio 2 в вашем коде.

EDIT:

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
}

Вы добавляете одну и ту же ссылку к каждому индексу. Таким образом, изменение любого индекса повлияет на остальные индексы.

0 голосов
/ 17 февраля 2012

Если вы просто создадите массив объектов ArrayList, все они будут нулевыми.Если вы затем выполните итерацию по массиву и создадите каждый ArrayList с новым, тогда все они будут разными (каждый вызов new ArrayList () создаст новый).

Можно поместить одну и ту же ссылку ArrayList вкаждый элемент массива путем создания ArrayList, а затем итерации по массиву и назначения каждому элементу массива значения (уже созданного) ArrayList.Это, вероятно, не то, что вы хотите сделать.

0 голосов
/ 17 февраля 2012

Вы сказали, что создали массив ArrayLists, но что вы назначили в каждый слот в этом массиве? Вы создали один экземпляр ArrayList и присвоили его всем 1000 слотам в массиве, или вы создали 1000 различных ArrayList (например, используя new в цикле) и присвоили разные каждому слоту массива?

Если вы храните несколько ссылок на один и тот же объект в нескольких местах, изменения этого объекта будут видны через все ссылки.

0 голосов
/ 17 февраля 2012

Да, остальные ArrayList останутся прежними.
Например.

array[0].set(0,object) 

Не влияет на ArrayList при array[1]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...