2014-02-12 3 views
2

Здесь an answer to "How do I instantiate a Queue object in java?",Очередь <Integer> д = новый LinkedList <Integer>()

Queue является интерфейсом. Вы не можете создавать экземпляр интерфейса напрямую, кроме как через анонимный внутренний класс. Обычно это не, что вы хотите сделать для коллекции. Вместо этого выберите существующую реализацию. Например:

Очередь q = новая LinkedList();

или

Очередь д = новый ArrayDeque();

Обычно вы выбираете осуществление сбора по характеристикам производительности и параллельности вы заинтересованы.

Как это работает? Что означает для Queue, интерфейс, чтобы реализовать реализацию LinkedList?

Означает ли это, что объекты могут быть удалены в порядке FIFO (первый в первом порядке), а вызовы методов связанного списка на q будут работать?

+0

двутавровой nterestings вопрос об интерфейсах полокоть http://stackoverflow.com/questions/1686174/when-should-one-use-interfaces http://stackoverflow.com/questions/1913098/what-is- the-difference-between-an-interface-and-abstract-class/1913185 # 1913185 – Narkha

+0

Здесь 'Queue q' является * ссылкой * в очередь. Эта ссылка может указывать на любой подкласс или реализацию 'Queue' –

+1

[Это должно быть хорошо прочитано] (http://stackoverflow.com/q/383947/2024761). – SudoRahul

ответ

2

Чтобы объяснить (возможно, несколько ошибочную) метафору - подумайте о 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 и любой подходящей библиотеки, то следует с уверенностью предположить, что каждый класс, реализующий интерфейс, будет соответствовать тому, что утверждает этот интерфейс, но просто имейте в виду, что нет ничего, что помешает ему не соответствовать когда дело доходит до более затененных библиотек или менее опытных программистов.

+0

Как обычно он делает такие вещи, как «LinkedList», «влияет на метод' 'add' в' Queue' '(http://docs.oracle.com/javase/6/docs/api/java/util /Queue.html#add%28E%29)? Будет ли это еще FIFO? – user3301555

+0

@ user3301555 Я отредактировал свой ответ с довольно подробной информацией, которая, я надеюсь, ответит на ваш вопрос. – Dukeling

0

Линия Queue q = new LinkedList(); является единственным зная, конкретная реализация списка лежит в основе переменной q, которая ведет себя как Queue - каждый последовательно код можно использовать только API из Queue при работе с q.

0

Все, что реализует интерфейс, согласуется с контрактом интерфейса. Это означает, что все, что говорится о очереди в javadocs, будет справедливо для всех реализующих классов, которым нравится LinkedList. Он будет обеспечивать те же функции, что и интерфейс.

0

Как вы сказали, Queue - это интерфейс, абстрактный тип данных, он определяет операции и их семантику (а именно дисциплину FIFO).

LinkedList - это класс, предоставляемый библиотекой Java.util, то есть реализует методы всех интерфейсов, которые он объявляет ... реализует. Тот факт, что это имя «Linkedlist», означает, что он использует ... LinkedList (узлы, содержащие элементы, выделенные в куче с указателями от узла к следующему). Это упорядоченная структура данных.

Если вы объявляете Очередь (левый, интерфейс) и создаете экземпляр с помощью LinkedList (правая часть, класс), вы будете иметь только операции Queue, а не методы List.

+0

«Если вы объявляете очередь (левый, интерфейс) и создаете экземпляр с помощью LinkedList (правая часть, класс), вы будете иметь только операции« Очередь », а не методы« Список ». - Почему у нас также нет методов LinkedList? – user3301555

+0

@ user3301555: поскольку доступными методами являются те, которые используются в интерфейсе, используемом в качестве типа переменной/параметра. Методы, реализованные в классе LinkedList, - это те, которые объявлены в интерфейсах, которые он реализует.Конечно, вы можете создать переменную «LinkedList» и создать экземпляр с этим же классом, но это плохое объектно-ориентированное программирование: вам нужна очередь (с enq/deq-операциями, дисциплина FIFO) или List (более гибкая, но сохраняйте в виду, что некоторые операции «Список», такие как доступ по индексу, быстрее реализуются в реализации ArrayList). – twfm

Смежные вопросы