【发布时间】:2011-04-13 04:54:41
【问题描述】:
是否有任何(实现良好的)可用于 Java 的侵入式双链表类?还是我应该自己做? Boost 支持 C++:http://beta.boost.org/doc/libs/1_40_0/doc/html/boost/intrusive/list.html。
侵入式列表是一个容器,在这种情况下,元素内有(在这种情况下)next 和 prev 指针,因此典型的列表操作(如替换和删除)可以直接针对基本类而不是容器类。在某些特定情况下,侵入式列表是最佳解决方案。
我试着举一个合适的例子。假设我有不同类型的类 X1 和 Y2 拥有的链表 L list1 和 L list2。
类Q(与其他无关或不容易访问x1和Y2的接口)需要做i)替换,ii)删除元素e的操作,它总是存在于list1 xor中的某个地方list2 取决于运行时状态,但该信息不会直接存储在任何地方。
使用侵入式列表 Q 可以只存储对成员元素 e 的元素的引用,并且它总是指向正确的位置。
否则,您必须从几个明显更复杂的解决方法中进行选择。 - 元素 e 的包装类以及完成操作 i 和 ii 的附加方法。没有。
基本上,问题仍然不在于性能,而在于架构复杂性。这也可以理解为一种共享对象情况,解决方案 IL 避免了对每个客户端 Lx 和 Q 的更新需求。
请注意,我不需要与其他标准容器兼容。只是一个通用的侵入式 lsit 实现,具有与未知元素类一起使用的迭代、添加、删除和查找操作。
谢谢。
【问题讨论】:
-
你能准确解释一下为什么“经典”java.util.LinkedList 对你来说不是一个足够好的 LinkedList 实现吗?还有为什么,哦,为什么,你宁愿不实现 Collection 接口,当它确定实现它会使你的集合可用时,而不是一个更多的 NIY 症状。
-
@Riduidel。此外,从 Java 1.6 开始,
LinkedList有了一个很好的替代方案,称为ArrayDeque。 -
侵入式列表的主要好处是,给定列表中的一个元素,它可以在恒定时间内被删除。无需搜索,因为
next和previous链接就在元素中。请参阅链接的 Boost 文档中的iterator_to。还可以节省一些内存,因为列表中的每个条目都不需要额外的包装对象。 -
谢谢戴夫。我也试着举一个一般的例子。假设我有不同类型的类 X 和 Y 拥有的链表 L1 和 L2。类 Q 需要对元素 e 进行操作,根据运行时状态,它总是存在于其他 L1 xor L2 中,但没有人知道直接哪一个。使用侵入式列表 Q 可以只存储指向成员元素 e 的“指针”,它总是指向正确的位置。
-
...我的意思是这个操作通常是替换操作。
标签: java list collections linked-list