Есть ли (хорошо реализованный) навязчивый класс (ы) двойного связанного списка для Java?
Не знаюдумаю, вы найдете его.
Мое понимание "навязчивый" состоит в том, что объект приложения, который необходимо сохранить в структуре данных, нуждается вдля непосредственного включения («вторжения») следующих / прежних указателей в объект приложения .
Это, в отличие от подхода «обертка указателя», где узел структуры данных содержит указатель наобъект приложения, таким образом, не требующий модификации объекта приложения.Интрузивный подход имеет ряд преимуществ , в том числе устранение двойной разыменования (один раз для узла и один раз для указателя узла на объект приложения), общего для подхода «обертка указателя».
Я не верю, что вы найдете навязчивую библиотеку структур данных для Java.В Java отсутствуют C ++ -подобные шаблоны или множественное наследование, и он не поддерживает копирование по значению всего объекта.Из-за этого я не думаю, что есть способ вообще добавить поля следующего / предыдущего экземпляра к объекту Java.
Например, учитывая объект приложения:
class Foo {
int bar;
}
как-товам нужно иметь возможность добавлять поля next / prev и методы управления списками к нему или его производным:
class Foo2 {
int bar;
Foo2 prev;
Foo2 next;
}
Один из способов добавить эти поля, предоставив базовый класс с этими полями для этих классов приложений.расширить - это подход Boost.Однако этот подход очень ограничивает язык с одним наследованием, такой как Java.
Интерфейсы Java часто являются ответом Java на множественное наследование, например интерфейс, требующий методы getNext () и getPrev () классов приложений.Однако, если вам нужны навязчивые структуры данных по соображениям производительности, доступ к полям next / prev с помощью метода может отрицательно повлиять на эти цели.
Обобщения Java также не расширяют классы необходимым способом.
Или я должен сделать свой собственный?
Если это один раз для конкретного случая для тщательно оцененной потребности, обязательно - бросьте свой собственный,Если вы пытаетесь накатить универсальный для общего пользования, я не уверен, что оно того стоит.
Один действительно грубый подход заключается в пользовательском расширении класса приложения для добавления необходимых полей:
class Foo3 extends Foo {
Foo3 prev;
Foo3 next;
}
и использовании повторного использования cut-n-paste для добавления методов управления списком.Однако я настоятельно рекомендую , а не , используя этот подход.
Мыльница
Вы неt объясните, почему вам нужна навязчивая структура данных.Возможно, у вас есть веские причины, чтобы нуждаться в них, но их сложно представить.Java в значительной степени зависит от использования указателей объектов, и попытаться избежать их, как это, будет трудно.
С уважением предлагаю вам подумать:
- пытаетесь ли вы преждевременно оптимизировать,
- добавляете ненужную сложность для небольшого выигрыша
- если скоростьи управление памятью имеет первостепенное значение, вы используете правильный язык?