2012-05-25 5 views
1

Это странный вопрос. Но здесь идет.Удаление объектов по ссылке в Java

У меня есть объект X, который вставлен в массив, в хэш-таблицу, внутри другого объекта (контейнерный объект). Он представляет экземпляры X в точке P в 3d-пространстве.

Иногда я хочу обновить X на заданном P. Это достаточно просто - вспомните точку P из таблицы и непосредственно манипулируйте массивом.

Теперь скажите, что эти X являются частью Y-фрагментов Y, чтобы быть точными. Скажем, данный Y уходит. Теперь, если Y уходит, все X, прикрепленные к нему, тоже должны уйти, верно?

Чтобы быть точным, объект Y окончательно снимается с модели. Действительно ли оно удалено или нет, оно несущественное (например, оно может храниться где-то в другом месте.) Но главное, помимо проверки каждой точки в окрестности Y для ее X, как правильно удалить их из хеш-таблицы?

  1. Они часть массива, поэтому другой Y в X, вероятно, будут там, так что нам нужно удалить только иксы, которые принадлежат к данному Y.
  2. Мы можем искать Хеш структуру для X, которые принадлежат Y - например, мы можем определить все точки P, которые занимал бы Y, а затем вытащить эти контейнеры и удалить все X, которые прикреплены к нашему Y.
  3. Можем ли мы удалить их напрямую? Если Y имеет список своих X, могут ли они быть удалены по ссылке, без необходимости выполнять усилия по поиску таблицы?

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

Это означает, что когда один ссылочный класс удаляет объект, объект должен быть «удален» универсально; ни один из других списков не должен содержать ссылку на него.

+0

Можете ли вы уточнить, является ли ваша установка 'ArrayList >' или 'HashSet >'? – trutheality

+0

HashTable , Container содержит несколько массивов. –

ответ

1

В Java эта проблема часто обращались с WeakReference<T> объектов: если вы не хотите, чтобы ссылка предотвратить объект X из собираемых, сделать ее WeakReference<X>: Java будет обнулить его, когда X уже не сильно не ссылаться из любого места остальное.

Например, вы можете сделать List<X>, который хранит все объекты, которые являются живыми, и сделать все остальные ссылки на X слабым. Когда объект удаляется из списка и его последняя сильная ссылка исчезает, она становится коллекционируемой независимо от количества слабых ссылок на нее. Очевидным недостатком является то, что вам нужно обратить внимание на нули перед разыменованием каждой слабой ссылки. На этом этапе Java делает все отслеживание ссылок для вас; все, что вам нужно сделать, это очистить слабые ссылки, которые пошли null, что намного проще, чем поиск в большом количестве списков.

+0

Да, хотя объекты уже выведены из таблицы с использованием логики опроса - то есть проверьте перед тем, как вы разыщите. Плоский список (используемый для рисования) и хеш-лист (используемые для обновления по точкам) не так сильны, как список, хранящийся объектом Y, поскольку объект Y является тем, что концептуально связывает X с миром вообще. Или, говоря так, X не будет бессмысленным, если ассоциированного Y не существует. –

+1

@RiverC Обратите внимание, что все (не слабые) ссылки на Y и его X должны исчезнуть для 'WeakReference', чтобы стать коллекционируемыми. Более того, он не сразу получает нуль - X может все еще быть живым, когда Y ушел - только тогда, когда GC решает сделать сбор, который он будет собран. (Хотя вы можете вызвать GC в своем коде, чтобы это произошло сразу.) – trutheality

+0

Возможно, мне придется. Поскольку мы говорим о обновлениях от кадра к кадру, если в списке списков есть мусор, у нас есть проблемы. –

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