2

Итак, я читал исходный код для java.util.LinkedList, и я заметил, что дизайн меня заинтриговал. Это извлекается из метода .clear(), где они итеративно проходят через каждый элемент связанного списка, чтобы удалить все из памяти. Мой вопрос: почему они определяют переменную next вместо назначения x напрямую? Не требуется ли время для копирования этого элемента? По крайней мере, он временно занимает больше места, но в пределах этой области.Что быстрее, назначая переменную напрямую или сохраняя темп?

for (Node<E> x = first; x != null;) { 
    Node<E> next = x.next; 
    x.item = null; 
    x.next = null; 
    x.prev = null; 
    x = next; 
} 
+1

Потому что им необходимо сохранить 'x.next', прежде чем очистить его, для обхода. То, что вы предлагаете, не будет работать. – EJP

+0

Кстати, для кого-то интересует, почему явный отчет явно явно, см. Http://stackoverflow.com/questions/575995/clear-impl-in-javas-linkedlist – ykaganovich

ответ

0

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

Во-первых, важно понять, что на самом деле происходит внутри JVM, когда мы используем объекты. В Java объект (обратите внимание, что это не включает примитивные типы), фактически не передается, когда мы их используем. Вместо этого мы используем ссылки на объекты, которые просто указывают на указанные объекты. Мы делаем это так, чтобы не беспокоиться о распределении/распределении памяти. Теперь, чтобы обеспечить удаление объекта, когда он больше не нужен, все объекты имеют счет того, сколько раз он в настоящее время ссылается в текущем состоянии программы. Вообще говоря, при вводе области, которая использует какой-либо объект, счетчик ссылок объекта увеличивается, вводя область и уменьшаясь, оставляя область. Теперь, когда объект достигает 0 ссылок, это означает, что в настоящее время нет части нашей программы, которая использует этот объект, поэтому его можно безопасно удалить. Это было просто краткое изложение того, как работает сбор мусора, но в конечном счете сложнее.

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

for (Node<E> x = first; x != null;) { 
    x.item = null; 
    x.prev = null; 
    x = x.next; 
} 

Затем узел х, прежде чем мы назначили его x.next все еще сохраняет ссылку на x.next, который, очевидно, нежелательно, потому что этот объект будет продолжать плавать в памяти, даже если исходный x был удален/удален из области видимости.

Чтобы ответить на ваш вопрос о том, что происходит быстрее, это незначительно. Да, в этой области мы сохраняем несколько байтов для создания переменной next, но важно понять, что мы создаем ссылку на нее, мы фактически не создаем экземпляр нового объекта, поэтому накладных расходов практически нет (и оптимизирован для JVM). Этот объект следующий объект временно помещается в стек, который перезаписывается на следующей итерации цикла, поэтому он также не создает проблем с использованием памяти.

+0

Чтобы ответить на вопрос, который быстрее, это бессмысленно.Вы не можете сравнивать две вещи для скорости, когда работает только один из них. – EJP

 Смежные вопросы

  • Нет связанных вопросов^_^