Java - Можем ли мы установить firstNode в null в связанном узле, чтобы удалить все записи? - PullRequest
1 голос
/ 12 февраля 2020

У меня есть следующий код:

public final class LinkedBag<T> implements BagInterface<T> {
    private Node firstNode;
    private int numberOfEntries;

    public LinkedBag() {
        firstNode = null;
        numberOfEntries = 0;
    }

    // Other methods defined
    public int getCurrentSize() { }
    public boolean isEmpty() { }
    public boolean add(T newEntry) { }
    public T remove() { }
    public boolean remove(T anEntry) { }
    public int getFrequencyOf(T anEntry) { } 
    public boolean contains(T anEntry) { }
    public T[] toArray() { }

    public void clear() { 
        while(!isEmpty())
            remove();
    } 
}

Для удаления всех записей вышеприведенная версия метода clear освобождает каждый узел в цепочке, тем самым делая его пустым.

Однако, чтобы удалить все записи. Будет ли приведенная ниже версия метода clear освобождать все узлы в цепочке, тем самым делая его пустым?

    public void clear() { 
        firstNode = null;
    }

Ответы [ 3 ]

1 голос
/ 12 февраля 2020

Да; кроме того, вы также должны помнить, чтобы установить numberOfEntries = 0; тоже. Тогда ваш связанный список находится в том же состоянии, как если бы только что был создан новый пустой связанный список (обратите внимание, что ваш конструктор выполняет те же две функции), поэтому он правильно представляет пустой список.

Что касается сборщика мусора, это автоматически освободит удаленные объекты узла за кулисами, потому что они больше не доступны при живых ссылках. Чтобы избежать утечек памяти в таких языках, как Java, основная проблема заключается в том, чтобы не сохранять ссылки на данные, которые вам больше не нужны. В этом случае после установки firstNode = null; ваш экземпляр вообще не сохраняет ссылок, поэтому утечка памяти отсутствует.

1 голос
/ 12 февраля 2020

Да, если первый узел будет пустым, он будет работать. Поскольку ссылки на все последующие узлы будут потеряны, они будут автоматически освобождены сборщиком мусора.

1 голос
/ 12 февраля 2020

Да, было бы. В отличие от C / C ++, где мы заботимся об освобождении памяти, выделенной нами ранее, Java заботится о сборе мусора , когда нет сильных ссылок на объект.

Когда вы делаете заголовок связанного списка (firstNode) нулевым, не будет (и не должно быть) никаких ссылок на этот узел. Следовательно, он имеет право на сборку мусора (G C). Глядя на второй узел в списке, не было бы никаких других ссылок на него, кроме заголовка, и, следовательно, он также может быть собран.

Расширение этого, весь список (все узлы в списке) может быть GCed.

...