Освой Java играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

LinkedList

Класс LinkedList имеет больше операций, чем ArrayList, а значит более сложный и требующий больше памяти. Класс представляет структуру данных связного списка и реализует интерфейсы List, Dequeue, Queue.

LinkedList позволяет хранить любые объекты, в том числе null и повторяющиеся.

Операции вставки и удаления в середине списка работают у него эффективнее. Но хуже обстоит дело с операциями произвольного доступа. В зависимости от вашей задачи и будет обусловлен выбор - ArrayList или LinkedList. Принцип работы сильно отличается. Тут уже не используется массив, а набор данных с двумя указателями на следующий и предыдущий объект. Вам не нужно думать о них, всё происходит под капотом.

Для добавления элемента в конец списка используется метод add(), для удаления используется метод remove().


List<String> linkedList = new LinkedList<>();
linkedList.add("Barsik");
linkedList.add("Murzik");
linkedList.add("Ryzhik");
Iterator<String> iterator = linkedList.iterator();
String firstCat = iterator.next(); // обратиться к первому элементу
Log.i("Test", firstCat);
String secondCat = iterator.next(); // обратиться ко второму элементу
Log.i("Test", secondCat);

Используемый в примере итератор имеет ограниченные возможности, например, его метод add() добавляет новый элемент в конец списка. Чтобы иметь возможность вставлять в середину, используйте интерфейс ListIterator. Кроме того, в ListIterator имеются методы previous() и hasPrevious() для прохода по списку в обратном направлении.

Метод add() итератора вводит новый элемент до текущей позиции итератора. Например, в следующем примере пропускается первый элемент связного списка и вводится элемент "Пушок" перед вторым элементом.


List<String> linkedList = new LinkedList<>();
linkedList.add("Barsik");
linkedList.add("Murzik");
linkedList.add("Ryzhik");
ListIterator<String> iterator = linkedList.listIterator();
iterator.next(); // пропускаем первый элемент списка
iterator.add("Пушок");
Log.i("Test", linkedList.toString());

// Результат [Barsik, Пушок, Murzik, Ryzhik]

Также есть удобные методы addFirst(), addLast(), addAll().

Получить объект можно через get(), getFirst(), getLast().

Для изменения элемента используется метод set().

Для удаления - remove() и clear().

Метод contains() проверяет наличие конкретного элемента.

Метод element() идентичен getFirst() и присутствует из-за принадлежности к интерфейсу Queue, который используется в LinkedList. А также есть метод peek(), который идентичен getFirst(), но не вызовет ошибку, если объект будет несуществующим, а просто вернёт null. А ещё есть методы peekFist() и peekLast(), которые аналогичны peek(), но более понятны по названию.


LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("Барсик");
linkedList.add("Мурзик");
linkedList.add("Рыжик");
System.out.println(linkedList.peek());
System.out.println(linkedList.peekFirst());
System.out.println(linkedList.peekLast());

Для удаления отдельного элемента кроме метода remove() можно вызвать методы poll(), pollFirst(), pollLast().


LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("Барсик");
linkedList.add("Мурзик");
linkedList.add("Рыжик");
System.out.println(linkedList.poll());
System.out.println(linkedList);

На самом деле методов гораздо больше, изучайте документацию.

Дополнительное чтение

Что «под капотом» у LinkedList?

Реклама