Почему повторное заполнение массива перед использованием метода удаления влияет на содержимое после использования метода remove?Эффекты повторного заполнения массиваList до/после использования метода удаления
Я пытаюсь удалить все элементы из ArrayList (элемент за элементом), начиная с самого высокого индекса. Причина копирования массива заключается в том, что я могу последовательно ссылаться на идентичный набор данных в других примерах кода позже (используя методы, которые изменяют массив), которые здесь не показаны.
Почему выходные данные отличаются для обоих этих примеров кода?
//populate arrrayList
for (int i = 0; i<1000; i++){
int randNum = rand.nextInt(1000);
arrayList.add(randNum);
}
//create a identical arrayList for testing purposes
for (int i = 0; i<1000; i++){
testArrayList.add(arrayList.get(i));
// ...some other arrayList accessor methods here
//re-populate the testArrayList with original random numbers
for (int i = 0; i<1000; i++){
testArrayList.add(arrayList.get(i));
}
System.out.println("Contents of al: " + arrayList);
System.out.println("Contents of tal: " + testArrayList);
System.out.println();
// ArrayList remove (low index to high index)
for (int i = 0; i < 1000; i++) {
testArrayList.remove(0);
}
System.out.println("Contents of al: " + arrayList);
System.out.println("Contents of tal: " + testArrayList);
System.out.println();
В приведенной выше версии вывод показывает, что оба массива содержат одни и те же элементы - (неожиданно).
В следующем коде я удаляю (то, что я думал просто избыточным) повторно заполняющим циклом, и вывод показывает, что второй массив под названием «testArrayList» пуст (как и ожидалось).
//populate arrrayList
for (int i = 0; i<1000; i++){
int randNum = rand.nextInt(1000);
arrayList.add(randNum);
}
//create a identical arrayList for testing purposes
for (int i = 0; i<1000; i++){
testArrayList.add(arrayList.get(i));
}
System.out.println("Contents of al: " + arrayList);
System.out.println("Contents of tal: " + testArrayList);
System.out.println();
// ArrayList remove (low index to high index)
for (int i = 0; i < 1000; i++) {
testArrayList.remove(0);
}
System.out.println("Contents of al: " + arrayList);
System.out.println("Contents of tal: " + testArrayList);
System.out.println();
Я понял, что цикл повторного населения в первом примере кода было просто излишним процесс и будет копировать содержимое ArrayList в testArrayList ПЕРЕД удалением элементов из testArrayList. Почему кажется, что цикл в первом примере repopulates testArrayList ПОСЛЕ кода, который следует за ним? Я ожидал, что оба этих примера кода выплюнут те же результаты. Может кто-нибудь объяснить, почему первый пример неэффективен при удалении элементов в testArrayList? Благодарю.
Минимальный код примера –
Действительно, для вашего же блага читайте javadoc List и ArrayList. Он имеет конструктор копирования, метод addAll() и метод clear(). Удаление с самого начала в цикле крайне неэффективно: оно заставляет список копировать все элементы снова и снова из индекса в индекс - 1. –
Собственно, это и есть цель этого упражнения.Я демонстрирую именно то, что некоторые способы доступа и изменения содержимого ArrayList более эффективны, чем другие. Я удалил код, который я использую во время каждого типа цикла доступа, чтобы свести к минимуму количество кода и сосредоточиться на моем фактическом вопросе. – taky2