ArrayList는 배열을 사용해서 List를 구현한 클래스지만 LinkedList는 각가의 노드를 연결하는 방식을 사용합니다.
아래와 사진과 같이 LinkedList를 표현할 수 있습니다.
LinkedList는 양방향 연결 리스트(Doubly Linked List)로 구현되어 있고 각각의 데이터가 노드로 구
성되어 연결이 되는 구조입니다.
즉 각각의 노드는 다음 노드(next) 와 이전 노드(prev) 값을 내부적으로 가지고 있습니다.
추가나 삭제를 할 경우 변경되는 노드만 다시 연결해주면 됩니다.
그래서 주로 ArrayList는 검색이 많은 경우에 사용하고 LinkedList는 잦은 삽입/삭제 시 사용합니다.
아래 구문을 추가해서 LinkedList를 사용할 수 있게 해 줍니다.
import java.util.LinkedList;
자바의 LinkedList는 아래 명령어 중 하나를 선택해서 생성 가능합니다.
LinkedList<Integer> list1 = new LinkedList<Integer>(); // 타입 지정
LinkedList<Integer> list2 = new LinkedList<>(); // 타입 생략 가능
LinkedList<Integer> list3 = new LinkedList<>(integers1); // 다른 Collection값으로 초기화
LinkedList<Integer> list4 = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5)); // Arrays.asList()
Set이나 다른 ArrayList 등을 전달해서 해당 값으로 초기화하는 것도 가능합니다.
Arrays.asList로 한 번에 여러 개의 값을 입력하면서 초기화시키는 방법도 존재합니다.
ArrayList와 다른 점은 가용량이 의미가 없기 때문에 가용량을 받는 생성자가 존재하지 않는다는 점입니다.
List를 구현했기 때문에 add() 메소드로 엘레멘트를 추가할 수 있고 set() 메소드로 기존에 추가된 값을 변경하는 것 또한 가능합니다.
LinkedList<String> animals = new LinkedList<>();
// add() method
animals.add("dog");
animals.add("cat");
animals.add(0, "cow");
animals.add("mouse");
// set() method
animals.set(0, "human");
System.out.println(animals);
add()에 인덱스를 지정하지 않으면 가장 끝에 값이 추가되고 값을 찾아갈 때 처음 부터 순차적으로 찾아갑니다.
그래서 값 추가 시 순차적으로 탐색할 것 같지만 그렇게 동작하지는 않습니다.
내부적으로 Last라는 변수가 마지막 노드를 가르키고 있기 때문에 탐색하지 않고 바로 연결합니다.
아래는 결과값 입니다.
remove() 메소드로 값을 삭제할 수 있고 값 전체 삭제 하고 싶을 경우 clear()를 사용하면 됩니다.
String removedAnimal = animals.remove(0);
System.out.println("Removed color is " + removedAnimal);
animals.remove("cat");
System.out.println(animals);
animals.clear();
System.out.println(animals);
아래는 결과값 입니다.
LinkedList의 전체 값 확인은 ArrayList와 동일합니다.
https://velog.io/@jybin96/%EC%9E%90%EB%B0%94-ArrayList-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%98%88%EC%A0%9C
Iterator<String> iterator = animals.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println();
// using listIterator
ListIterator<String> listIterator = animals.listIterator(animals.size());
while (listIterator.hasPrevious()) {
System.out.print(listIterator.previous() + " ");
}
System.out.println();
아래는 결과값
LinkedList의 값 존재 유무 확인은 ArrayList와 동일합니다.
https://velog.io/@jybin96/%EC%9E%90%EB%B0%94-ArrayList-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%98%88%EC%A0%9C
boolean contains = animals.contains("dog");
System.out.println(contains);
int index = animals.indexOf("dog");
System.out.println(index);
index = animals.indexOf("nothing");
System.out.println(index);
아래는 결과값
그래서 ArrayList를 LinkedList로 바꾸거나 그 반대로 변환해도 대부분은 문제없이 동작합니다.