Java 将LinkedHashSet转换为列表 假设列表b是一个LinkedList 假设列表a也是一个LinkedList

Java 将LinkedHashSet转换为列表 假设列表b是一个LinkedList 假设列表a也是一个LinkedList,java,algorithm,list,Java,Algorithm,List,问题: 如何在固定时间内附加这些列表 这是可能的,因为LinkedList可能是一个双链接列表(否则它无法实现Deque接口)。追加双链表是一个0(1)操作 addAll方法不是以固定时间运行的 问题: 如何在固定时间内将LinkedHashSet转换为列表 这可能也是因为LinkedHashSet“维护一个贯穿其所有条目的双链接列表”。您需要实现自己的类。LinkedList类不公开其内部节点结构,因此不能将其最后一个节点指向另一个LinkedList的第一个节点 对于LinkedHa

问题:

  • 如何在固定时间内附加这些列表
这是可能的,因为LinkedList可能是一个双链接列表(否则它无法实现Deque接口)。追加双链表是一个0(1)操作

addAll
方法不是以固定时间运行的

问题:

  • 如何在固定时间内将LinkedHashSet转换为列表

这可能也是因为
LinkedHashSet
“维护一个贯穿其所有条目的双链接列表”。

您需要实现自己的类。
LinkedList
类不公开其内部节点结构,因此不能将其最后一个节点指向另一个
LinkedList
的第一个节点


对于
LinkedHashSet
,答案是类似的:虽然它确实维护了这个双链接列表,但您无法访问它。

您的假设是基于没有封装,即
LinkedHashSet
愿意将其内部
LinkedList
公开给外部世界,而我怀疑它不是

同样地,连接两个链表-我不知道每个节点是否知道它在哪个列表中,但这肯定是一种可能,它会破坏您的常量时间附加。即使他们没有,只要你把一个列表的头和另一个列表的尾连接起来,你就会遇到问题——你有两个列表都引用相同的数据,这会产生一些奇怪的后果


换句话说,从计算机科学的角度来看,这两种操作都是可行的,您可以构建自己的实现来支持它们,但这并不意味着Java API以支持这些操作的方式公开了其内部内容。

您无法访问它,但我怀疑Collections可以访问它,因此,你不应该放弃希望,这是一个可行的,快速解决你的问题


我进一步看了看,你是对的。如果您有
设置which=某个构造函数
,那么您可以编写
列表=新链接列表(which)因为LinkedList有一个Collections构造函数,Set有一个Collections接口。

Java难道还没有附加LinkedList的方法吗?这些方法当然应该使用LinkedList而不是List,因为它们根本不能与ArrayList一起工作。将LinkedHashSet转换为LinkedList也是如此。事实上,这就是我问题的重点。@Klems:不,我不相信,因为这样你就有了两个共享节点的LinkedList对象。同样,如果调用方随后修改了返回的列表,您如何建议从LinkedHashSet创建LinkedList而不引入可能的损坏?(我想它可能会返回一个不可变的视图。)哦,我现在明白问题了。正如你所说,它可能返回一个只读列表。这有点像返回迭代器。然而,要附加2个列表,该方法可以清除2个初始列表并返回结果列表。但我明白你的意思。@Klems:好吧,你已经可以返回迭代器了。。。这台电视机本身就很好用。如果你只能从中阅读,拥有一个LinkedList会有什么好处?@Klems:我想我们必须同意不同意见。。。但是您可以很容易地使用该属性构建自己的实现。。见@Michael McGrady的答案