Java: метод изменения размера, кто-нибудь может объяснить? - PullRequest
0 голосов
/ 19 сентября 2018

Я не уверен, как работает этот метод.Насколько я понимаю, мы создаем временный массив с удвоенным размером theItems.length (theItems - это другой массив).После этого мы копируем элементы во временный массив и в конце пишем theItems = temp;(Я не уверен, почему и что происходит) (это означает, что элементы также удваивают его размер?).Разве мы не можем удвоить размер элементов без использования temp?

private void resize() {
    String[] temp = new String[theItems.length*2];
    for (int i=0 ; i < noOfItems ; i++){
        temp[i]=theItems[i];
    }
    theItems=temp;
}

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Я не уверен, почему и что происходит

Вы создаете другой массив с большим количеством места для дополнительных элементов.Массивы имеют фиксированный размер в Java;после создания его нельзя изменить.Здесь длина нового массива в два раза больше старого.Затем простой цикл for копирует ссылки на элементы.

означает ли это, что элементы также удваивают свой размер?

Нет, ссылка на массив theItems переназначается наНовый, больший массив только что создан.

Разве мы не можем удвоить размер элементов без использования temp?

Вы можете просто заменить theItems новым массивом, но потом вы просто потеряли ссылку на исходный массив, в котором есть все элементы, которые вы хотите сохранить, так что это бесполезно.

Вот что происходит:

  1. Initialусловие.

    theItems -> ["one", "two", "three"]
    
  2. Новый массив создан.

    theItems -> ["one", "two", "three"]
    
    temp     -> [null , null , null , null, null, null]
    
  3. Элементы скопированы.

    theItems -> ["one", "two", "three"]
    
    temp     -> ["one", "two", "three", null, null, null]
    
  4. Переменная theItems переназначена.

    theItems \       ["one", "two", "three"]  <- will be garbage collected.
             |
    temp   --+> ["one", "two", "three", null, null, null]
    

Переменная temp выйдет из области видимости, но theItems все равно будет ссылаться на новый массив.

0 голосов
/ 19 сентября 2018

Чтобы ответить на ваш вопрос в конце, вы можете использовать вспомогательные методы, как показано в комментарии, но где-то что-то должно создать отдельный новый массив и скопировать все элементы.

Массивы - это конструкции фиксированного размера - когда вы их создаете, вы не можете увеличить или уменьшить их на месте.Когда вы создаете массив, часть кучи Java (которая является термином для области памяти, в которой хранятся объекты) равна размеру одного элемента (в данном случае, ссылки на строку), умноженному на длину массива.зарезервировано, и ссылка на эту память назначается переменной, указанной вами в левой части оператора, как в String[] items = new String[10].

Таким образом, чтобы увеличить items, вам нужно создать новый массив нужного вам размера, скопировать все существующие элементы по порядку, а затем переназначить переменную, которая содержала меньший массив, на ссылкубольший массив в этот момент содержится в temp.items = temp; просто копирует ссылку в items, поэтому items и temp ссылаются на один и тот же массив.Затем, когда метод завершается, items остается, в то время как temp удаляется.

Кроме того, поскольку теперь существует массив (на который ранее ссылался items), на который не ссылается ни одна переменная, Java приметзаботиться о очистке этого старого массива во время циклов сбора мусора.Однако вам не нужно беспокоиться об удалении элементов в вашем массиве, поскольку вы скопировали их ссылки в новый массив.

0 голосов
/ 19 сентября 2018

String[] temp = new String[theItems.length*2]; создает Array в два раза больше theItems.Так, скажем, если бы theItems было {"Hello", "Hi", "Goodbye", "Bye"}, мы бы тогда имели

__ __ __ __ __ __ __ __

как temp.Затем

for(int i=0; i<noOfItems; i++){
    temp[i]=theItems[i];
}

Копирует элементы в temp.Таким образом, у нас будет:

"Hello", "Hi", "Goodbye", "Bye" __ __ __ __

(четыре пустых пробела в конце)

А затем theItems=temp; присваивает theItems temp.Таким образом, переменная theItems будет иметь четыре пустых пробела, и к ней можно добавить больше элементов.

Обратите внимание, что класс Arrays уже имеет встроенную функцию для этого: Arrays.copyOf

...