Поиск по сайту:

Java LinkedList - LinkedList в Java


Java LinkedList — это реализация интерфейсов List и Deque. Это один из часто используемых классов реализации списка. Он расширяет AbstractSequentialList и реализует интерфейсы List и Deque. Это упорядоченная коллекция, которая поддерживает повторяющиеся элементы. Он хранит элементы в порядке вставки. Он поддерживает добавление нулевых элементов. Он поддерживает операции на основе индексов. Если вы хотите узнать больше об основах List, прочтите этот пост: Java List.

Опубликовать краткое содержание

В этом посте мы собираемся обсудить следующие концепции.

  • Связанный список Java
  • Схема классов Java LinkedList
  • Методы списка Java LinkedList
  • Методы очереди Java LinkedList
  • Основной пример Java LinkedList
  • Общие шаблоны LinkedList для Java
  • Массив Java в LinkedList
  • Java LinkedList в массив
  • Случаи использования Java LinkedList в реальном времени
  • Внутреннее представление Java LinkedList
  • Как вставка работает в Java LinkedList?
  • Как работает удаление в Java LinkedList?
  • Операции очереди Java LinkedList
  • Java SE 8: Java LinkedList для потоковой передачи
  • Связанный список Java SE 9

Связанный список Java

В этом разделе мы обсудим некоторые важные моменты, связанные с Java LinkedList:

  • Класс Java LinkedList является членом Java Collections Framework.
  • Это реализация интерфейсов List и Deque.
  • Внутренне это реализовано с использованием структуры данных двусвязного списка.
  • Он поддерживает повторяющиеся элементы.
  • Он хранит или поддерживает свои элементы в порядке вставки.
  • Мы можем добавить любое количество нулевых элементов.
  • Он не синхронизирован, что означает, что он не является потокобезопасным.
  • Мы можем создать синхронизированный LinkedList, используя метод Collections.synchronizedList().
  • В приложениях Java мы можем использовать его как список, стек или очередь.
  • Он не реализует интерфейс RandomAccess. Таким образом, мы можем обращаться к элементам только в последовательном порядке. Он не поддерживает произвольный доступ к элементам.
  • Когда мы пытаемся получить доступ к элементу из LinkedList, поиск этого элемента начинается с начала или конца LinkedList в зависимости от того, где эти элементы доступны.
  • Мы можем использовать ListIterator для итерации элементов LinkedList.
  • Начиная с Java SE 8 и выше, мы можем преобразовывать LinkedList в Stream и наоборот.
  • В Java SE 9 будет добавлено несколько фабричных методов для создания неизменяемого связанного списка.

Диаграмма классов Java LinkedList

Методы списка Java LinkedList

В этом разделе мы обсудим некоторые полезные и часто используемые методы Java LinkedList. Следующие методы наследуются от интерфейса List или Collection:

  1. int size(): чтобы получить количество элементов в списке.
  2. boolean isEmpty(): чтобы проверить, пуст список или нет.
  3. boolean contains(Object o): возвращает значение true, если этот список содержит указанный элемент.
  4. Итератор iterator(): возвращает итератор для элементов в этом списке в правильной последовательности.
  5. Object[] toArray(): возвращает массив, содержащий все элементы в этом списке в правильной последовательности.
  6. boolean add(E e): Добавляет указанный элемент в конец этого списка.
  7. boolean remove(Object o): удаляет первое вхождение указанного элемента из этого списка.
  8. boolean continueAll(Collection c): сохраняет в этом списке только те элементы, которые содержатся в указанной коллекции.
  9. void clear(): удаляет все элементы из списка.
  10. E get(int index): возвращает элемент в указанной позиции в списке.
  11. E set(int index, E element): заменяет элемент в указанной позиции в списке указанным элементом.
  12. ListIterator listIterator(): возвращает итератор списка для элементов в списке.
  13. List subList(int fromIndex, int toIndex): возвращает представление части этого списка между указанным fromIndex, включительно, и toIndex, исключая. Возвращаемый список поддерживается этим списком, поэтому неструктурные изменения в возвращаемом списке отражаются в этом списке и наоборот.

Методы очереди Java LinkedList

Следующие методы относятся к классу LinkedList, унаследованному от интерфейса Deque:

  1. void addFirst(E e): вставляет указанный элемент в начало этого списка.
  2. void addLast(E e): вставляет указанный элемент в конец этого списка.
  3. E getFirst(): извлекает, но не удаляет первый элемент этого списка. Этот метод отличается от peekFirst только тем, что выдает исключение, если этот список пуст.
  4. E getLast(): извлекает, но не удаляет последний элемент этого списка. Этот метод отличается от peekLast только тем, что выдает исключение, если этот список пуст.
  5. E remvoeFirst(): удаляет и возвращает первый элемент из этого списка.
  6. E removeLast(): удаляет и возвращает последний элемент из этого списка.
  7. boolean offerFirst(E e): вставляет указанный элемент в начало этого списка.
  8. boolean offerLast(E e): вставляет указанный элемент в конец этого списка.
  9. E pollFirst(): извлекает и удаляет первый элемент этого списка или возвращает значение null, если этот список пуст.
  10. E pollLast(): извлекает и удаляет последний элемент этого списка или возвращает значение null, если этот список пуст.
  11. E peekFirst(): извлекает, но не удаляет первый элемент этого списка или возвращает значение null, если этот список пуст.
  12. E peekLast(): извлекает, но не удаляет последний элемент этого списка или возвращает значение null, если этот список пуст.

Базовый пример Java LinkedList

В этом разделе мы обсудим базовый пример Java LinkedList. В следующих разделах мы рассмотрим еще несколько полезных операций. Пример:-

import java.util.LinkedList;
import java.util.List;

public class LinkedListDemo 
{
  public static void main(String[] args) 
  {
	List names = new LinkedList();
	names.add("Rams");
	names.add("Posa");
	names.add("Chinni");
        names.add(2011);
			
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());
  }
}

Выход:-

LinkedList content: [Rams, Posa, Chinni, 2011]
LinkedList size: 4

Здесь мы создали объект LinkedList и добавили 4 элемента. Как мы уже говорили, метод LinkedList.size() используется для получения количества элементов в списке. ПРИМЕЧАНИЕ. - Без использования универсальных элементов Java LinkedList поддерживает гетерогенные элементы. Однако не рекомендуется использовать коллекции без обобщений. Давайте рассмотрим преимущества Java Generics и их использование в следующем разделе на одном простом примере.

Обобщения Java LinkedList

В этом разделе мы обсудим, как использовать Generics с Java LinkedList. Как мы знаем, универсальные шаблоны Java полезны для написания программ обеспечения безопасности типов и выполнения усиленных проверок типов во время компиляции. Они также полезны для устранения накладных расходов при литье. Пример:-

import java.util.LinkedList;
import java.util.List;

public class LinkedListGenericsDemo
{
  public static void main(String[] args) 
  {
	List<String> names = new LinkedList<>();
	names.add("Rams");
	names.add("Posa");
	names.add("Chinni");
        // We cannot add other than Strings
        // names.add(2011);
			
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());
  }
}

Выход:-

LinkedList content: [Rams, Posa, Chinni]
LinkedList size: 3

Здесь мы создали объект LinkedList с помощью Generics и добавили 3 элемента. Когда мы пытаемся добавить число для LinkedList, возникает ошибка времени компиляции.

Массив Java в LinkedList

В этом разделе мы рассмотрим, как преобразовать массив Java в объект LinkedList. Мы можем сделать это многими способами, однако я дал здесь только один подход. Пример:-


import java.util.LinkedList;
import java.util.List;

public class JavaArrayToLinkedListDemo 
{
	public static void main(String[] args) 
	{
		Integer[] numbers = {1,2,3,4,5};
		List<Integer> numbersList = new LinkedList<>();
		for(Integer s : numbers){
			numbersList.add(s);
		}
		System.out.println(numbersList);
	}
}

Выход:-

[1, 2, 3, 4, 5]

Java LinkedList в массив

В этом разделе мы рассмотрим, как преобразовать Java LinkedList в массив. Мы можем сделать это многими способами, однако я дал здесь только один подход. Пример:-

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class LinkedListToJavaArrayDemo 
{
	public static void main(String[] args) 
	{		
		List<Integer> numbersList = new LinkedList<>();
		numbersList.add(1);
		numbersList.add(2);
		numbersList.add(3);
		numbersList.add(4);
		numbersList.add(5);
		Integer[] numbers = new Integer[numbersList.size()];
		
		numbers = numbersList.toArray(numbers);
		System.out.println(Arrays.toString(numbers));

	}
}

Выход:-

[1, 2, 3, 4, 5]

Варианты использования Java LinkedList в реальном времени

В этом разделе мы обсудим, что является лучшим и что является худшим сценарием для использования LinkedList в приложениях Java. Лучший сценарий использования: -

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

Почему? Потому что нам не нужно делать больше сдвигов, чтобы добавлять или удалять элементы в середине списка. См. «Как работает вставка в J Java LinkedList?» раздел, чтобы понять это в деталях.Худший сценарий использования:-

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

Почему? Поскольку LinkedList поддерживает только последовательный доступ, НЕ поддерживает произвольный доступ. См. «Как работает удаление в J Java LinkedList?» раздел, чтобы понять это в деталях.ПРИМЕЧАНИЕ:- LinkedList реализует List, Deque, Cloneable и Serializable.Но он НЕ реализует интерфейс RandomAccess.

Внутреннее представление Java LinkedList

  1. Левая часть узла используется для указания на предыдущий узел (или элемент) в LinkedList.
  2. Правая часть узла используется для указания на следующий узел (или элемент) в LinkedList.
  3. Центральная часть узла используется для хранения фактических данных.

Как работает вставка в Java LinkedList?

Мы уже видели, как LinkedList хранит свои элементы в виде узлов в предыдущем разделе. В этом разделе мы обсудим внутреннюю работу операции вставки Java LinkedList.

linkedList.add(2,54);

Здесь мы пытаемся выполнить операцию вставки, чтобы добавить новый элемент со значением «54» по индексу 2.5. Обновленный LinkedList выглядит так, как показано ниже.

Как работает удаление в Java LinkedList?

Мы уже видели, как LinkedList выполняет внутреннюю операцию вставки в предыдущем разделе. В этом разделе мы обсудим внутреннюю работу операции удаления Java LinkedList.

linkedList.remove(3);

Здесь мы пытаемся выполнить операцию удаления, чтобы удалить элемент, доступный по индексу 3.5. Обновленный LinkedList выглядит следующим образом.

Операции очереди Java LinkedList

Здесь мы рассмотрим, как объект LinkedList работает как Deque. Мы используем эти операции для реализации очередей или стеков. Мы подробно обсудим, как работают стек или очереди, в моих следующих постах. Пример:-

import java.util.LinkedList;
import java.util.LinkedList;
import java.util.Deque;

public class LinkedListDequeOperationsDemo 
{
  public static void main(String[] args) 
  {
	Deque names = new LinkedList();
	names.add(2);
	names.addFirst(1);
	names.addLast(3);
	names.addFirst(0);
	names.addLast(4);
			
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());
	names.removeFirst();
	names.removeLast();
	
	System.out.println("LinkedList content: " + names);
	System.out.println("LinkedList size: " + names.size());	
  }
}

Выход:-

LinkedList content: [0, 1, 2, 3, 4]
LinkedList size: 5
LinkedList content: [1, 2, 3]
LinkedList size: 3

Java SE 8: Java LinkedList для потоковой передачи

Здесь мы рассмотрим, как преобразовать объект LinkedList в концепцию Java SE 8 Stream. Пример:-

import java.util.LinkedList;
import java.util.List;

public class LinkedListToStreamDemo 
{
  public static void main(String[] args) 
  {		
	List<Integer> numbersList = new LinkedList<>();
	numbersList.add(1);
	numbersList.add(2);
	numbersList.add(3);
	numbersList.add(4);
	numbersList.add(5);
		
	//convert List to stream
	numbersList.stream().forEach(System.out::println);
  }
}

Выход:-

1
2
3
4
5

Связанный список Java SE 9

В Java SE 9 корпорация Oracle собирается добавить несколько полезных служебных методов для создания неизменяемых списков. Если вы хотите подробно изучить их с некоторыми полезными примерами, прочтите мой пост по адресу: Java SE 9: фабричные методы для неизменяемых списков. Это все краткий обзор LinkedList в Java. Я надеюсь, что эти примеры Java LinkedList помогут вам приступить к программированию LinkedList. Спасибо, что читаете мои уроки. Пожалуйста, напишите мне комментарий, если вам нравятся мои уроки или у вас есть какие-либо проблемы или предложения или какие-либо ошибки типа.