LinkedList는 불연속적으로 존재하는 데이터를 서로 연결(link)한 형태로 구성되어 있다. 데이터를 삭제, 추가할 수 있고 처리 속도가 빠르다.
LinkedList는 이동 방향이 단방향이기 때문에 다음 요소에 대한 접근은 쉽지만 이전요소에 대한 접근은 어렵다. 이점을 보완한 것이 DoubleyLinkedList이다.
DoubleyLinkedList
1.참조형 변수를 만들어줘야 한다.
2. RandomAcess 불가능
3. 웬만해서는 arraylist를 사용하지만 중간에 값을 넣어야 하는 경우 linkedlist를 사용해야 한다.
LinkedList 클래스는 이름과 달리 '링크드 리스트'가 아닌 '더블 링크드 리스트'로 구현되어 있다.
public class _01_LinkedList {
public static void main(String[] args) {
LinkedList<String> list1 = new LinkedList<>();
list1.add("Java");
list1.add("Python");
list1.add("C++");
list1.add("Spring");
list1.add("Ruby");
list1.add("Jsp");
//요소변경
list1.set(1, "Javascript");
list1.remove();//첫 번째 요소 제거
System.out.println("LinkedList : " + list1);
list1.remove(3);//네 번째 요소 제거
System.out.println("LinkedList : " + list1);
list1.remove("Jsp");//특정 값의 요소 제거
System.out.println("LinkedList : " + list1);
//첫 번째 요소값 얻어오기
String str = list1.get(0);
System.out.println("첫 번째 요소의 값은 : " + str);
//저장된 요소의 개수 리턴
int count = list1.size();
System.out.println("저장된 원소의 개수 : " + count);
//Collection.contains(특정값) : 컬렉션에 특정값이 존재하면 true, 없으면 false
//boolean isExist = list1.contains("C");
//if(isExist) {
if(list1.contains("C")) {
System.out.println("존재하는 문자열입니다.");
}else {
System.out.println("존재하지 않는 문자열입니다.");
}
System.out.print("\n반복문을 이용한 요소 출력");
for(int i = 0; i < list1.size(); i++) {
System.out.print(list1.get(i) + " ");
}
System.out.println();
System.out.print("foreach(범위 기반 for문)으로 출력 : ");
//list1의 요소를 elem로 반복하며 접근하겠다.
for(String elem : list1) {//elem라는 이름으로 각각의 요소에 접근하겠다.
System.out.print(elem + " ");
}
System.out.println();
int[] arr = {1, 2, 3, 4, 5};
for(int n : arr) {
System.out.print(n + " ");
}
System.out.println();
double[] num = {1.1, 2.2, 3.3};
for(double d : num) {
System.out.print(d + " ");
}
System.out.println();
//-------------------------------------------------------------//
LinkedList<Integer> list2 = new LinkedList<>();
list2.add(1);
list2.add(2);
list2.add(3);
list2.add(4);
list2.add(5);
//JDK.5부터 사용가능
//첫 번째 요소 뺴내기
int extract = list2.peek();
System.out.println("첫 번쨰 요소 : " + extract);
System.out.println("LinkedList : " + list2);
//첫 번째 요소 빼낸 후, 리스트에서 제거
int extract2 = list2.poll();
System.out.println("첫 번쨰 요소 : " + extract2);
System.out.println("LinkedList : " + list2);
//맨 뒤에 요소 추가
list2.offer(extract2);
System.out.println("LinkedList : " + list2);
}
}
순서 이동하기
import java.util.LinkedList;
import java.util.Scanner;
public class _03_MovePlayer {
public static void movePlayers(LinkedList<String> list, int moves) {
//Player 이동횟수
for(int i = 0; i < moves; i++) {
//첫 번째 플레이어 뺴내기
String extract = list.poll();
//Player를 맨 뒤로 이동시킨다.
list.offer(extract);
}
}
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
list.add("Player 1");
list.add("Player 2");
list.add("Player 3");
list.add("Player 4");
list.add("Player 5");
System.out.println("Player 순서 : " + list);
Scanner in = new Scanner(System.in);
System.out.print("Player 순서를 몇번 움직이겠습니까?");
int moves = in.nextInt();
in.close();
//Player 순서를 움직이는 메서드 호출
movePlayers(list, moves);
System.out.println(moves + "회 이동 후 Player 순서 : " + list);
}
}
1. 순차적으로 추가/삭제 하는 경우에는 ArrayList가 LinkedList보다 빠르다.
2. 중간 데이터를 추가/삭제하는 경우에는 LinkedList가 ArrayList보다 빠르다.
'JavaStudy' 카테고리의 다른 글
| [Java] TreeSet (0) | 2023.12.06 |
|---|---|
| [Java] HashSet, Iterator (0) | 2023.12.06 |
| [Java] 래퍼클래스(wrapper) (0) | 2023.12.05 |
| [Java] ArrayList (0) | 2023.12.04 |
| [Java] collections framework (1) | 2023.12.04 |