Освой Java играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Класс 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?