Назад к вопросам
Middle
104
questionbank
Какие существуют виды ссылок в Java и в чём их отличия?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В Java существуют сильные (strong), мягкие (soft), слабые (weak) и призрачные (phantom) ссылки.
Сильная ссылка:
- Присваивается обычным способом.
- Объект, на который ссылается сильная ссылка, не будет собран сборщиком мусора, пока на него есть хотя бы одна сильная ссылка.
Object obj = new Object(); // сильная ссылка
Мягкая ссылка (SoftReference):
- Объект, на который ссылается мягкая ссылка, может быть собран сборщиком мусора только в том случае, если системе не хватает памяти.
- Часто используются для реализации кэшей.
SoftReference<Object> softRef = new SoftReference<>(new Object());
Object obj = softRef.get(); // может вернуть null, если объект был собран
Слабая ссылка (WeakReference):
- Объект, на который ссылается слабая ссылка, может быть собран сборщиком мусора в любой момент, как только на него не останется сильных ссылок.
- Используются для предотвращения утечек памяти, например, при хранении слушателей или контекстов.
WeakReference<Object> weakRef = new WeakReference<>(new Object());
Object obj = weakRef.get(); // может вернуть null в любой момент
Призрачная ссылка (PhantomReference):
- Объект, на который ссылается призрачная ссылка, не будет собран сборщиком мусора до тех пор, пока все призрачные ссылки на него не будут очищены.
- Нельзя получить доступ к объекту через
get(). - Используются в сочетании с
ReferenceQueueдля выполнения действий после того, как объект становится доступным для сборки, но до того, как память будет фактически освобождена. Применяются для более сложного управления ресурсами, чем с использованием методаfinalize().
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
PhantomReference<Object> phantomRef = new PhantomReference<>(new Object(), referenceQueue);
// phantomRef.get() всегда вернет null
Основные отличия представлены в таблице:
| Тип ссылки | Критерий сборки мусора | Возможность получить объект через get() |
Применение |
|---|---|---|---|
| Сильная | Только если нет сильных ссылок | Да | Обычное использование |
| Мягкая | Если не хватает памяти | Да (может быть null) | Кэши |
| Слабая | Если нет сильных ссылок | Да (может быть null) | Предотвращение утечек памяти (слушатели, контексты) |
| Призрачная | После очистки всех призрачных ссылок (в сочетании с ReferenceQueue) |
Нет (всегда null) | Продвинутое управление ресурсами, замена finalize() |