2015-12-09 1 views
1

Я написал код, который работает, но я не уверен. РассмотримДействительный итератор в удаленном списке?

LinkedList<Iterator<Integer>> iterators; 
HashMap<Character, TreeSet<Integer>> map; 
for (char c : map.keySet()) { 
    iterators.add(map.get(c).iterator()); 
    map.remove(c); 
} 

Даже если первоначальный TreeSet был удален, итератор, кажется, работает нормально (т.е. идет в первоначальном упорядочении TreeSet). Я не совсем понимаю, почему он функционирует - кажется, что здесь есть минус-значение, а не передача по ссылке. Тем не менее, очевидно, что если бы я должен был написать

map.get(c).add(6); 

TreeSet бы на самом деле добавить 6 на карте (не просто добавить 6 к копии TreeSets в карте), что указывает на прибудете проходит по ссылке. Может кто-то помочь устранить путаницу здесь?

+0

Какое отношение имеет 'Iterator' от' TreeSet' к 'HashMap'? –

ответ

0

Я прочитал ваше сообщение 5 раз, и я все еще не могу понять, где это замешательство?

Вы спрашиваете, почему после удаления записи с Map у вас все еще есть iterator в iterators? Вот как ссылки на Java работает ...

Line:

iterators.add(map.get(c).iterator()); 

создает сильную ссылку на TreeSet, которая находится под c, так что это set не будет gced.

Когда дело доходит до передачи по ссылке против пропущенного значения - ничего нет true pass-by-reference известный из C/C++. Для получения дополнительной информации смотрите here.

Когда дело доходит до линии:

map.get(c).add(6); 

я не имею ключ не что вы имеете в виду

TreeSet бы на самом деле добавить 6 на карте (не просто добавить 6 к копии в TreeSets в карте)

что вы имеете в виду копию TreeSets на карте? Копировать что? Он указывает на то же самое TreeSet как iterator от iterators баллов.

1

Снятие TreeSet от HashMap не разрушает TreeSet; он просто удаляет ссылку в HashMap до TreeSet. Номер HashMap не содержит копию TreeSet, только ссылку на TreeSet.

В первый:

{map} -----> {aTreeSet} 
        | 
        v 
       {6} 

Назначение Iterator «s является перебирать что-то. В этом случае логичным путем для итерации по элементам TreeSet является сохранение собственной ссылки на TreeSet (или внутренняя структура данных в пределах TreeSet). Элементы всегда упоминаются по крайней мере в одной сильной ссылке, поэтому они никогда не собираются с мусором.

Когда Iterator создан:

{map} -----> {aTreeSet} <----- {Iterator} 
        | 
        v 
       {6} 

После удаления с карты (и дополнения к LinkedList):

{map}  {aTreeSet} <----- {Iterator} <----- {iterators} 
        | 
        v 
       {6} 

Суммируя, TreeSet элементов никогда не имеет права для сбора мусора ; существует только один объект TreeSet, и его элементы все еще доступны для итерации.

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