이것은 실제로 필요합니다. 왜 필요한지를 보여주기 위해 알고리즘과 코드를 살펴 보겠습니다. 이 질문은 복잡한 주제를 다룹니다. 따라서 제 답변은 초보자에게 더 이해하기 쉽도록 약간 공식화되었습니다.
먼저 객체를 사용할 때 실제로 JVM에서 내부적으로 발생하는 것을 이해하는 것이 중요합니다. Java에서 객체 (기본 유형을 포함하지 않음)는 실제로 사용할 때 전달되지 않습니다. 대신 우리는 참조을 객체에 사용합니다. 객체는 단순히 객체에 대한 포인터입니다. 우리는 메모리 할당/할당 해제에 대해 걱정할 필요가 없도록이 작업을 수행합니다. 이제는 객체가 더 이상 필요하지 않을 때 객체가 삭제되도록 보장하기 위해 모든 객체는 현재 프로그램 상태에서 참조되는 횟수를 계산합니다. 대체로 말하자면, 어떤 객체를 사용하는 스코프를 입력 할 때, 객체의 참조 카운트는 스코프를 입력 할 때 증가하고 범위를 벗어나 감소합니다. 이제 개체가 0 개의 참조에 도달하면 현재이 개체를 사용하는 프로그램의 일부가 없으므로 안전하게 삭제할 수 있습니다. 이것은 가비지 수집이 어떻게 작동하는지 간단히 요약 한 것이지만 궁극적으로 더 복잡합니다.
이 방법
반복적 목록의 각 항목을 통해가되고,
는 현재 노드가 X
역시 참조가 각 항목을 역 참조. 그것은 개체가
항목,
이전하고,이
다음가 null로 설정해야한다는 말을하지 않는,
X 이러한 개체에 대해 가지는만을 참조. 이것은 객체가 0 개의 참조를 가질 때 안전하게이 객체를 가비지 수집 할 수 있다는 것을 알기 위해 수행됩니다. 우리가
x.next에 할당하기 전에
이
for (Node<E> x = first; x != null;) {
x.item = null;
x.prev = null;
x = x.next;
}
그런 다음 노드 X은 아직 분명히 x.next에 대한 참조를 유지 : 당신은 여기로 제안으로 우리가 할 것 인 경우 원하지 않는 이유는 원래 x이 삭제되었거나 범위를 벗어나더라도 해당 객체가 계속 메모리에 떠 다니기 때문입니다.
귀하의 질문에 대한 답변은 어느 것이 더 빠르나 중요하지 않습니다. 예, 해당 범위에서 변수 을 생성하기위한 몇 바이트를 저장합니다 ().하지만 실제로는 새 객체를 인스턴스화하지 않으므로 참조를 작성하는 것이 중요합니다. 실제로 오버 헤드가 없습니다. JVM에서 최적화). 이 다음 개체는 스택에 일시적으로 할당됩니다.이 스택은 루프의 다음 반복시 덮어 쓰여 지므로 메모리 사용에 대한 우려도 없습니다.
왜냐하면 탐색을하기 전에'x.next'를 지워야하기 때문입니다. 당신이 제안하는 것은 효과가 없을 것입니다. – EJP
그런데 목록을 명확하게 지우는 이유에 대해 궁금한 사람은 http://stackoverflow.com/questions/575995/clear-impl-in-javas-linkedlist을 참조하십시오. – ykaganovich