[Java] day19. 컬렉션 프레임워크 LinkedList

하루만에 많을 양을 학습하려니 약간 헤롱거리는 것이..
이게 그 말로만 듣던.. 타자치는 감자 상태??? 가 되어버렸다.
LinkedList
ArrayList가 배열을 이용해서 발생할 수 있는 성능적인 단점을 보완하고자 고안되었다.
내부는 이중 연결리스트로 구현 되어 있다.
단일 연결 리스트
저장한 요소가 순서를 유지하지 않고 저장 되지만 이러한 요소들 사이를 링크로 연결하여 구성하며
마치 연결 된 리스트 형태인 것 처럼 만든 자료구조이다.
요소의 저장과 삭제 시 다음 요소를 가리키는 참조 링크만 변경하면 되기 때문에
요소의 저장과 삭제가 빈번히 일어나는 경우 ArrayList보다 성능면에서 우수하다.
하지만 단일 연결리스트는 다음 요소만 링크하기 때문에 이전 요소로 접근하기 어렵다.
이를 보완하고자 만든 것이 이중 연결 리스트이다.
이중 연결 리스트
단일 연결 리스트는 다음 요소만 링크하는 반면 이중 연결 리스트는 이전 요소도 링크하여
이전 요소로 접근하기 쉽게 고안된 자료구조이다.
하지만 내부적으로 요소를 저장하는 방법에 차이가 있는 것이다.
각 컬렉션 프레임워크 클래스들의 특징을 파악하고 그에 따라 적합한 자료구조를 구현한 클래스를 선택하는 것이 좋다.
LinkedList 인스턴스 생성
List<String> linkedList = new LinkedList<>();
요소를 추가할 때는 add()를 이용한다.
linkedList.add("apple");
linkedList.add("banana");
linkedList.add("orange");
linkedList.add("mango");
linkedList.add("grape");
저정된 요소의 갯수는 size() 메소드를 이용한다.
for문과 size()를 이용해서 반복문을 활용할 수도 있다,
요소를 꺼내올 때는 get()을 사용하며, 인자로 전달하는 정수는 인덱스처럼 사용하면 된다.
System.out.println(linkedList.size());
for(int i = 0; i < linkedList.size(); i++) {
System.out.println(i + " : " + linkedList.get(i));
}
//향상 된 for문도 사용 가능하다.
for(String s : linkedList) {
System.out.println(s);
}
요소를 제거할 때는 remove() 메소드를 이용하며 인덱스를 활용한다.
linkedList.remove(1);
set() 메소드를 이용해서 요소를 수정할 수도 있다.
linkedList.set(0, "pineapple");
toString() 메소드가 오버라이딩 되어 있어서 모든 요소 정보를 쉽게 볼 수 있다.
System.out.println(linkedList);
isEmpty() 메소드를 이용해서 list가 비어 있는지 확인할 수 있다.
System.out.println(linkedList.isEmpty());
리스트 내 요소를 모두 제거하는 clear() 메소드를 이용할 수 도 있다.
linkedList.clear();