웹사이트 검색

Java LinkedList - Java의 LinkedList


Java LinkedList는 List 및 Deque 인터페이스의 구현입니다. 자주 사용되는 List 구현 클래스 중 하나입니다. AbstractSequentialList를 확장하고 List 및 Deque 인터페이스를 구현합니다. 정렬된 컬렉션이며 중복 요소를 지원합니다. 삽입 순서로 요소를 저장합니다. null 요소 추가를 지원합니다. 인덱스 기반 작업을 지원합니다. List 기본 사항에 대해 자세히 알아보려면 Java List 게시물을 참조하세요.

간단한 포스트 목차

이 게시물에서는 다음 개념에 대해 논의할 것입니다.

  • 자바 LinkedList
  • 자바 LinkedList 클래스 다이어그램
  • 자바 LinkedList 목록 방법
  • 자바 LinkedList Deque 메서드
  • 자바 LinkedList 기본 예제
  • 자바 LinkedList 제네릭
  • LinkedList에 대한 Java 배열
  • 배열에 Java LinkedList
  • Java LinkedList 실시간 사용 사례
  • Java LinkedList의 내부 표현
  • Java LinkedList에서 삽입은 어떻게 작동합니까?
  • 자바 LinkedList에서 삭제는 어떻게 작동합니까?
  • 자바 LinkedList Deque 작업
  • Java SE 8: 스트리밍할 Java LinkedList
  • 자바 SE 9 LinkedList

자바 LinkedList

이 섹션에서는 Java LinkedList에 대한 몇 가지 중요한 사항에 대해 설명합니다.

  • Java LinkedList 클래스는 Java Collections Framework의 멤버입니다.
  • List 및 Deque 인터페이스의 구현입니다.
  • 내부적으로 이중 연결 목록 데이터 구조를 사용하여 구현됩니다.
  • 중복 요소를 지원합니다.
  • 삽입 순서로 요소를 저장하거나 유지합니다.
  • null 요소는 얼마든지 추가할 수 있습니다.
  • 동기화되지 않았으므로 스레드로부터 안전하지 않습니다.
  • Collections.synchronizedList() 메서드를 사용하여 동기화된 LinkedList를 만들 수 있습니다.
  • Java 애플리케이션에서는 목록, 스택 또는 대기열로 사용할 수 있습니다.
  • RandomAccess 인터페이스를 구현하지 않습니다. 따라서 순차적으로만 요소에 액세스할 수 있습니다. 무작위로 요소에 액세스하는 것은 지원하지 않습니다.
  • LinkedList에서 요소에 액세스하려고 하면 해당 요소를 사용할 수 있는 위치에 따라 LinkedList의 시작 또는 끝에서 해당 요소 검색이 시작됩니다.
  • ListIterator를 사용하여 LinkedList 요소를 반복할 수 있습니다.
  • Java SE 8부터 LinkedList를 스트림으로 또는 그 반대로 변환할 수 있습니다.
  • Java SE 9는 Immutable LinkedList를 생성하기 위해 몇 가지 팩토리 메소드를 추가할 예정입니다.

Java LinkedList 클래스 다이어그램

Java LinkedList 목록 메서드

이 섹션에서는 유용하고 자주 사용되는 Java LinkedList 메서드 중 일부에 대해 설명합니다. 다음 메서드는 List 또는 Collection 인터페이스에서 상속됩니다.

  1. int size(): 목록의 요소 수를 가져옵니다.
  2. boolean isEmpty(): 목록이 비어 있는지 확인합니다.
  3. boolean contains(Object o): 이 목록에 지정된 요소가 포함되어 있으면 true를 반환합니다.
  4. Iterator iterator(): 이 목록의 요소에 대한 반복자를 적절한 순서로 반환합니다.
  5. Object[] toArray(): 이 목록의 모든 요소를 적절한 순서로 포함하는 배열을 반환합니다.
  6. boolean add(E e): 지정된 요소를 이 목록의 끝에 추가합니다.
  7. boolean remove(Object o): 이 목록에서 지정된 요소의 첫 번째 항목을 제거합니다.
  8. boolean retainAll(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 Deque 메서드

다음 메서드는 Deque 인터페이스에서 상속된 LinkedList 클래스에만 적용됩니다.

  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 제네릭

이 섹션에서는 Java LinkedList와 함께 제네릭을 사용하는 방법에 대해 설명합니다. 아시다시피 Java Generics는 Type Safety 프로그래밍을 작성하고 컴파일 타임에 더 강력한 유형 검사를 수행하는 데 유용합니다. 또한 캐스팅 오버헤드를 제거하는 데 유용합니다. 예:-

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

여기에서 Generics로 LinkedList 객체를 생성하고 3개의 항목을 추가했습니다. LinkedList에 대한 숫자를 추가하려고 하면 컴파일 타임 오류가 발생합니다.

LinkedList에 대한 Java 배열

이 섹션에서는 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 실시간 사용 사례

이 섹션에서는 Java 응용 프로그램에서 LinkedList를 사용하는 가장 좋은 시나리오와 최악의 시나리오에 대해 설명합니다. 최상의 사용 사례 시나리오:-

  • 자주 사용하는 작업이 List 중간에 요소를 추가하거나 제거할 때 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);

여기서 우리는 인덱스 2.5에 "54\ 값을 가진 새로운 요소를 추가하기 위해 Insertion 연산을 수행하려고 합니다. 업데이트된 LinkedList는 아래와 같습니다.

Java LinkedList에서 삭제는 어떻게 작동합니까?

이전 섹션에서 LinkedList가 내부적으로 삽입 작업을 수행하는 방법을 이미 살펴보았습니다. 이 섹션에서는 Java LinkedList의 삭제 작업이 내부적으로 작동하는 방식에 대해 설명합니다.

linkedList.remove(3);

여기서 우리는 인덱스 3.5에서 사용 가능한 요소를 삭제하기 위해 삭제 작업을 수행하려고 합니다. 업데이트된 LinkedList는 아래와 같습니다.

Java LinkedList Deque 작업

여기에서는 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

자바 SE 9 LinkedList

Java SE 9에서 Oracle Corp은 Immutable List를 생성하는 몇 가지 유용한 유틸리티 메서드를 추가할 예정입니다. 몇 가지 유용한 예제를 통해 자세히 알아보려면 다음 게시물을 참조하십시오. Java SE 9: Factory Methods for Immutable List 여기까지가 Java의 LinkedList에 대한 요약입니다. 이 Java LinkedList 예제가 LinkedList 프로그래밍을 시작하는 데 도움이 되기를 바랍니다. 내 자습서를 읽어 주셔서 감사합니다. 내 튜토리얼이 마음에 들거나 문제나 제안 또는 유형 오류가 있으면 댓글을 남겨주세요.