这是an answer to "How do I instantiate a Queue object in java?",
Queue
是一个界面。除非通过匿名内部类,否则无法直接实例化接口。通常,此不是您要为集合执行的操作。而是选择现有的实现。例如:队列q = new LinkedList();
或
队列q = new ArrayDeque();
通常,您会根据您感兴趣的性能和并发特性选择一个集合实现。
这是如何工作的? Queue是一个接口,它对LinkedList的实现有什么意义?
这是否意味着对象可以在FIFO中出列(先进先出顺序),并且在q
上调用链表方法会起作用?
答案 0 :(得分:4)
用一个(或许有些有缺陷的)隐喻来解释 - 将LinkedList
想象成一张纸。将Queue
的作业视为涵盖了这篇论文的一小部分,其中只显示了Queue
。
如果你在它上面调用Queue
方法,那么它仍会像LinkedList
那样做,因为那就是那张纸。
鉴于大部分内容已被覆盖,您无法看到它是LinkedList
,您只能看到它是Queue
,因此您只能调用Queue
方法在它上面。
整张纸仍在那里 - 您可以简单地删除封面,这将是将其转换回LinkedList
的同义词,这样您就可以调用任何LinkedList
方法再一次。
现在提供更多技术细节:
顺便说一句LinkedList
“通常会”执行我上面提到的事情,我的意思是LinkedList
始终是一个链接列表,即使您将其分配给Queue
- 它不会突然开始使用数组作为底层实现,因为ArrayDeque
会(也实现Queue
)或其他东西。
Queue
实际上并不需要是FIFO(请参阅the docs)(如果需要,还需要LinkedList
),所以LinkedList
在这方面会有相当大的自由,所以让我们继续使用Deque
进行解释 - 它有方法支持从前面或后面添加和删除。
由于LinkedList
实现了Deque
,因此需要实现addFirst
函数。根据文档,addFirst
函数需要添加到Deque
的前面,实际上,使用LinkedList
,它会添加到LinkedList
的前面(虽然LinkedList
的正面不一定是Deque
的正面,但通过查看Deque
中实施的LinkedList
方法,我们看到正面Deque
的前面是LinkedList
的前面,并且所有方法都从其中一侧添加/删除,从正确的一侧执行此操作。)
现在有一个重要但有些令人困惑的注释 - LinkedList
可以,例如,实现Deque
并且addFirst
没有做到它应该做的事情 - 它可以,例如,打印一些随机文本。语言本身没有任何东西阻止这一点 - 因为,就编译器而言,实现Deque
只需要定义一堆方法 - 没有强制执行这些方法应该做的事情。就Java API和任何体面的库而言,应该可以安全地假设实现接口的每个类都符合该接口声称要做的事情,但请记住,没有什么能阻止它不符合要求当谈到更多阴暗的图书馆或经验不足的程序员时。
答案 1 :(得分:0)
行Queue q = new LinkedList();
是唯一一个知道列表的具体实现位于变量q
后面的行,它的行为类似于Queue
- 每个连续的代码只能使用{的API使用Queue
时的{1}}。
答案 2 :(得分:0)
实现接口的所有内容都同意遵守接口的约定。这意味着所有关于javadocs中的队列的内容都适用于所有类似LinkedList的实现类。它将以与界面定义相同的方式提供相同的功能。
答案 3 :(得分:0)
就像你说的,Queue是一个接口,一个抽象数据类型,它指定操作及其语义(即FIFO规则)。
LinkedList是Java.util库提供的类,意味着实现它声明为...实现的所有接口的方法。它的名称是“Linkedlist”这一事实意味着它使用了一个... LinkedList(包含在堆中分配的元素的节点,从节点到下一个节点的指针)。这是一个有序的数据结构。
如果你声明一个Queue(左手界面)并用LinkedList(右手,类)实例化它,你将只有Queue操作,而不是List方法。
答案 4 :(得分:0)
它基本上转化为创建LinkedList对象,该对象遵循Queue操作。 所有节点都将相互连接,但是您可以在列表中添加/删除/调整大小。