Структуры данных Java (простой вопрос) - PullRequest
1 голос
/ 06 ноября 2010

Скажите, что я хочу работать со связанным списком в Java. Я думал, что лучший способ создать это:

Список списка = новый LinkedList ();

Но я заметил, что таким образом я могу использовать только методы из списка, которые являются общими. Я предполагаю, что реализация различна для разных структур данных.

Поэтому, если я хочу использовать определенные методы для связанного списка, я должен создать список следующим образом:

Список LinkedList = новый LinkedList ();

Какая главная причина этого?

Tnanks.

Ответы [ 4 ]

4 голосов
/ 06 ноября 2010

List - это интерфейс, который абстрагирует реализацию базового списка. Это также реализуется, например, ArrayList.

Однако, если вы конкретно хотите LinkedList, нет ничего плохого в написании LinkedList list. Фактически, если вы просто передадите его в виде списка, люди могут (не зная реализации) бессознательно писать алгоритмы, такие как:

for(int i = 0; i < list.size(); i++)
{
  // list.get(i) or list.set(i, obj)
}

, которые являются линейными в списке произвольного доступа (например, ArrayList), но квадратичными для LinkedList (было бы предпочтительно использовать итератор или итератор списка). Java обеспечивает интерфейс маркера RandomAccess , чтобы вы могли различать.

Конечно, вы можете вызывать эти методы и для ссылки типа LinkedList, но люди должны с большей вероятностью учитывать стоимость.

Как примечание, в .NET LinkedList по этой причине не реализовано IList.

1 голос
/ 06 ноября 2010
List list = getSomeList();

Здесь вы говорите, что это список.Вы понятия не имеете, является ли это LinkedList или ArrayList или чем-то еще.Это абстрактная вещь (я предполагаю, что вы подразумеваете «абстрактный» под словом «универсальный», поскольку универсальные - это совсем другое).Таким образом, вы не можете относиться к нему, как к LinkedList - вы должны относиться к нему, как к List (что это такое).

Тот факт, что «вы знаете», что это LinkedList все хорошо, и вы можете спокойно использовать его, если вам это нужно.Но это может помочь сообщить компилятору, что это LinkedList, объявив его так, если он всегда будет действовать как LinkedList.

1 голос
/ 06 ноября 2010

Каждый LinkedList также является списком. Это также означает, что вы можете делать все с LinkedList, что вы можете делать с List, и что вы можете хранить LinkedList как List. Однако, когда вы сохраняете его как List, вы можете вызывать только те методы LinkedList, которые также есть у List.

Кстати: это не дженерики. Дженерики таковы:

LinkedList<String> list = new LinkedList<String>();
1 голос
/ 06 ноября 2010

Первая идиома позволяет вам изменить тип среды выполнения, на который указывает список, без изменения какого-либо клиентского кода, который его использует.

Какие методы в LinkedList, по вашему мнению, вам нужны, которых нет в List?Вы всегда можете использовать их.

Но вся идея интерфейсов в том, чтобы защитить клиентов от реализации интерфейса.

Если вам действительно нужен LinkedList, пусть будет так.Но я предпочитаю первую идиому, потому что в большинстве случаев мне действительно нужны методы List.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...