자바 LinkedList는 List 및 Deque 인터페이스의 구현체입니다. 이는 자주 사용되는 List 구현 클래스 중 하나입니다. 이는 AbstractSequentialList를 확장하고 List 및 Deque 인터페이스를 구현합니다. 이는 순서가 있는 컬렉션이며 중복 요소를 지원합니다. 요소를 삽입 순서대로 저장합니다. null 요소를 추가하는 것을 지원합니다. 인덱스 기반 작업을 지원합니다. List 기본 사항에 대해 더 알고 싶다면 이 게시물을 확인하십시오: Java List.
게시물 간단한 목차
이 게시물에서는 다음 개념을 논의할 것입니다.
- Java LinkedList
- Java LinkedList 클래스 다이어그램
- Java LinkedList List 메소드
- Java LinkedList Deque 메소드
- Java LinkedList 기본 예제
- Java LinkedList 제네릭
- Java Array to LinkedList
- Java LinkedList to Array
- Java LinkedList 실시간 사용 사례
- Java LinkedList의 내부 표현
- Java LinkedList에서 삽입이 작동하는 방법?
- Java LinkedList에서 삭제가 작동하는 방법?
- Java LinkedList Deque 작업
- Java SE 8: Java LinkedList to Stream
- Java SE 9 LinkedList
자바 LinkedList
이 섹션에서는 자바 LinkedList에 대한 몇 가지 중요한 포인트를 논의하겠습니다:
- 자바 LinkedList 클래스는 자바 컬렉션 프레임워크의 구성원입니다.
- 이는 List 및 Deque 인터페이스의 구현입니다.
- 내부적으로 이는 이중 연결 리스트 데이터 구조를 사용하여 구현됩니다.
- 중복 요소를 지원합니다.
- 삽입 순서대로 요소를 저장하거나 유지합니다.
- 아무 수의 null 요소를 추가할 수 있습니다.
- 동기화되지 않았으므로 스레드 안전하지 않습니다.
- Collections.synchronizedList() 메서드를 사용하여 동기화된 LinkedList를 생성할 수 있습니다.
- 자바 애플리케이션에서는 List, 스택 또는 큐로 사용할 수 있습니다.
- RandomAccess 인터페이스를 구현하지 않습니다. 따라서 순차적으로만 요소에 액세스할 수 있습니다. 요소에 무작위로 액세스할 수는 없습니다.
- LinkedList에서 요소에 액세스하려고 할 때, 해당 요소의 위치에 따라 LinkedList의 시작점 또는 끝점부터 검색이 시작됩니다.
- ListIterator를 사용하여 LinkedList 요소를 반복할 수 있습니다.
- Java SE 8부터는 LinkedList를 Stream으로 변환하거나 그 반대로 변환할 수 있습니다.
- Java SE 9에서는 변경 불가능한 LinkedList를 생성하기 위한 몇 가지 팩토리 메서드를 추가할 예정입니다.
Java LinkedList 클래스 다이어그램
우리가 아는 바와 같이, Java LinkedList는 List 구현 클래스 중 하나입니다. 또한 Deque를 구현합니다. 아래의 클래스 다이어그램에서 볼 수 있듯이 이는 AbstractList 클래스에서 직접 확장되지 않습니다. 대신 AbstractSequentialList 클래스를 확장합니다.
Java LinkedList 목록 메서드
이 섹션에서는 몇 가지 유용하고 자주 사용되는 Java LinkedList 메서드를 논의하겠습니다. 다음 메서드들은 List 또는 Collection 인터페이스에서 상속됩니다:
- int size(): 목록의 요소 수를 얻기 위해.
- boolean isEmpty(): 목록이 비어 있는지 여부를 확인하기 위해.
- boolean contains(Object o): 목록이 지정된 요소를 포함하면 true를 반환합니다.
- Iterator iterator(): 목록의 요소에 대한 올바른 순서로 반복자를 반환합니다.
- Object[] toArray(): 목록의 모든 요소를 올바른 순서로 포함하는 배열을 반환합니다.
- boolean add(E e): 지정된 요소를 이 목록의 끝에 추가합니다.
- boolean remove(Object o): 목록에서 지정된 요소의 첫 번째 발생을 제거합니다.
- boolean retainAll(Collection c): 지정된 컬렉션에 포함된 요소만 이 목록에 유지합니다.
- void clear(): 목록에서 모든 요소를 제거합니다.
- E get(int index): Returns the element at the specified position in the list.
- E set(int index, E element): Replaces the element at the specified position in the list with the specified element.
- ListIterator listIterator(): 목록의 요소 위를 이동하는 목록 반복자를 반환합니다.
- List subList(int fromIndex, int toIndex): 이 목록에서 지정된 fromIndex(포함)부터 toIndex(제외)까지의 부분에 대한 뷰를 반환합니다. 반환된 목록은 이 목록에 의해 지원되므로 반환된 목록의 비구조적 변경 사항이 이 목록에 반영되고 그 반대도 마찬가지입니다.
Java LinkedList Deque 메서드
다음 메서드는 Deque 인터페이스에서 상속된 LinkedList 클래스에 특정한 것입니다:
- void addFirst(E e): 지정된 요소를 이 목록의 시작 부분에 삽입합니다.
- void addLast(E e): 지정된 요소를 이 목록의 끝에 삽입합니다.
- E getFirst(): Retrieves, but does not remove, the first element of this list. This method differs from peekFirst only in that it throws an exception if this list is empty.
- E getLast(): Retrieves, but does not remove, the last element of this list. This method differs from peekLast only in that it throws an exception if this list is empty.
- E remvoeFirst(): Removes and returns the first element from this list.
- E removeLast(): Removes and returns the last element from this list.
- boolean offerFirst(E e): 지정된 요소를 이 목록의 맨 앞에 삽입합니다.
- boolean offerLast(E e): 지정된 요소를 이 목록의 끝에 삽입합니다.
- E pollFirst(): Retrieves and removes the first element of this list, or returns null if this list is empty.
- E pollLast(): Retrieves and removes the last element of this list, or returns null if this list is empty.
- E peekFirst(): Retrieves, but does not remove, the first element of this list, or returns null if this list is empty.
- E peekLast(): Retrieves, but does not remove, the last element of this list, or returns null if this list is empty.
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() 메서드는 목록의 요소 수를 얻는 데 사용됩니다. 참고:- Generics를 사용하지 않고도 Java LinkedList는 이종 요소를 지원합니다. 그러나 Generics 없이 Collections를 사용하는 것은 권장되지 않습니다. 간단한 예제와 함께 다음 섹션에서 Java Generics의 장점과 사용법을 탐색해 보겠습니다.
Java LinkedList Generics
이 섹션에서는 Java LinkedList와 함께 Generics를 사용하는 방법에 대해 설명합니다. Java Generics는 Type Safety 프로그래밍을 작성하고 컴파일 시간에 더 강력한 타입 확인을 수행하는 데 유용합니다. 또한 캐스팅 오버헤드를 제거하는 데도 유용합니다. 예시:-
import java.util.LinkedList;
import java.util.List;
public class LinkedListGenericsDemo
{
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]
LinkedList size: 3
여기에서 Generics로 LinkedList 객체를 생성하고 3개의 항목을 추가했습니다. LinkedList에 숫자를 추가하려고하면 컴파일 시간 오류가 발생합니다.
Java Array to 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를 Array로 변환
이 섹션에서는 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를 사용하는 최상의 및 최악의 시나리오에 대해 설명합니다. 최상의 사용 사례 시나리오:-
- 리스트의 중간에 요소를 추가하거나 제거하는 작업이 빈번한 경우 LinkedList를 사용하는 것이 가장 좋습니다.
왜냐하면 리스트의 중간에 요소를 추가하거나 제거하기 위해 더 많은 이동을 할 필요가 없기 때문입니다. 자세한 내용은 “Java LinkedList에서 삽입이 작동하는 방법” 섹션을 참조하십시오. 최악의 사용 사례 시나리오:-
- 우리가 자주 사용하는 작업이 목록에서 요소를 검색하는 것인 경우 LinkedList는 최악의 선택입니다.
왜냐하면? LinkedList는 순차적 액세스만 지원하며 무작위 액세스를 지원하지 않습니다. 이를 자세히 이해하려면 “Java LinkedList에서 삭제 작동 방식은 어떻게 되나요?” 섹션을 참조하십시오. 참고:- LinkedList는 List, Deque, Cloneable 및 Serializable를 구현하지만 RandomAccess 인터페이스를 구현하지 않습니다.
Java LinkedList의 내부 표현
우리가 알다시피 내부적으로 Java LinkedList는 이중 연결 목록을 사용하여 구현됩니다. 따라서 Java LinkedList는 요소를 노드로 나타냅니다. 각 노드는 아래에 표시된대로 3 부분으로 나뉩니다. 여기서 각 노드는 특정 목적으로 사용됩니다.
- 왼쪽 노드 부분은 LinkedList에서 이전 노드(또는 요소)를 가리키는 데 사용됩니다.
- 오른쪽 노드 부분은 LinkedList에서 다음 노드(또는 요소)를 가리키는 데 사용됩니다.
- 중앙 노드 부분은 실제 데이터를 저장하는 데 사용됩니다.
참고:- JVM에서 LinkedList는 요소를 연속적인 순서로 저장하지 않습니다. 이는 아래 다이어그램에서 왼쪽과 오른쪽 노드 부분을 사용하여 요소를 이용 가능한 공간에 저장하고 서로 연결합니다.
Java LinkedList에서 삽입 작업은 어떻게 작동합니까?
이전 섹션에서 LinkedList가 노드로 요소를 저장하는 방법을 이미 살펴보았습니다. 이번 섹션에서는 Java LinkedList의 삽입 작업이 내부적으로 어떻게 작동하는지에 대해 논의하겠습니다.
- 우리의 초기 LinkedList에 다음과 같은 데이터가 있다고 가정해 봅시다.
3. 이 LinkedList에 다음과 같은 삽입 작업을 수행하십시오
linkedList.add(2,54);
여기서 우리는 새로운 요소를 값 “54”를 가진 색인 2.5에 삽입하는 작업을 수행하려고 합니다. 업데이트된 LinkedList는 아래와 같이 보입니다.
Java LinkedList에서 삭제는 어떻게 작동합니까?
이전 섹션에서 LinkedList가 삽입 작업을 내부적으로 수행하는 방법을 이미 살펴 보았습니다. 이 섹션에서는 Java LinkedList의 삭제 작업이 내부적으로 어떻게 작동하는지에 대해 논의하겠습니다.
- 초기 LinkedList가 다음 데이터를 가지고 있다고 가정해 봅시다.
이 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를 Stream으로 변환
여기서 LinkedList 객체를 Java SE 8 Stream 개념으로 변환하는 방법을 살펴보겠습니다. 예시:-
import java.util.LinkedList;
import java.util.List;
public class LinkedListToStreamDemo
{
public static void main(String[] args)
{
List numbersList = new LinkedList<>();
numbersList.add(1);
numbersList.add(2);
numbersList.add(3);
numbersList.add(4);
numbersList.add(5);
// List를 스트림으로 변환
numbersList.stream().forEach(System.out::println);
}
}
출력:-
1
2
3
4
5
Java SE 9 LinkedList
Java SE 9에서 Oracle Corp는 변경 불가능한 목록을 생성하는 몇 가지 유용한 유틸리티 메서드를 추가할 예정입니다. 이를 몇 가지 유용한 예제와 함께 자세히 알아보려면 다음 내 게시물을 참조하십시오: Java SE 9: 변경 불가능한 목록을 위한 팩터리 메서드 이것이 Java에서 LinkedList에 대한 간단한 요약입니다. 이 Java LinkedList 예제가 LinkedList 프로그래밍을 시작하는 데 도움이 되기를 바랍니다. 내 튜토리얼을 읽어 주셔서 감사합니다. 튜토리얼이 마음에 들거나 문제가 있거나 제안이나 어떤 유형의 오류가 있는 경우 댓글을 남겨주세요.
Source:
https://www.digitalocean.com/community/tutorials/java-linkedlist-linkedlist-java