장점
단점
써야하는 경우
💡 미리 공간을 확보해야하고 고정되는 특성으로 유연하지 못하기 때문에 미리 크기를 특정할 수 없거나 크기를 유연하게 조정해야할 경우에는 List 자료구조를 쓴다.
데이터를 추가해서 링크를 연결해준다. 데이터를 삭제하는 경우에는 링크를 삭제하기만 하면 된다.
링크가 서로 끊어지고 레퍼런스가 없어지게 되면 garbage collector에 의해 자동으로 사라진다.
링크는 한쪽 방향으로 연결되어있다. 전 요소로 가려면 다시 처음부터 링크를 시작해야 한다.
💡 LinkedList는 List 인터페이스를 구현하고 있기 때문에 List 타입으로 표현하는 경우가 많다. 이 외에도 ArrayList, Vector, Stack 등 List 인터페이스를 구현하고 있다. add, remove, size 등의 메소드는 List 인터페이스에 의해 제공해주는 것이다.
List<String> list = new LinkedList<>();
링크가 양쪽 방향으로 연결되어 있다. 양쪽으로 왔다갔다 가능!
내부에 Array를 가지고 있고, 데이터를 추가하게 되면 새로운 Array를 만들고 기존의 것은 삭제한다. (→ resizable)
index를 이용해 값을 빠르게 조회한다는 Array의 특징때문에 LinkedList보다 좀더 유리하다.
내부에 Array를 가지고 있으며, ArrayList와 유사하게 동작한다.
그렇다면 다른점이 무엇일까?
ArrayList는 값이 추가되거나 삭제될 때 비동기적으로 동작하지만, Vector는 동기적(synchronized)으로 동작한다는 점에서 조금더 오버 헤드가 있다.
Vector는 멀티쓰레드 같은 환경 즉, Thread-safe가 필요할 때 쓰인다.
데이터의 정합성을 지켜주는 것이 더 중요하다면 벡터를 사용하자.
List<MyData> list2 = new Vector<>();💡 list2는 벡터형인데, 리스트형으로도 표현 가능하다.
Vector도 LinkedList와 마찬가지로 List 인터페이스를 구현하고 있기 때문이다.
⇒ “다형성”
장점
단점
써야하는 경우
💡 대체적으로 Array에 비해 유연한 List를 사용하는 경우가 많다.
List 인터페이스를 구현하고 있는 클래스들 중에서 ArrayList, Vector가 많이 쓰인다. (내부적으로 Array를 가지고 있어서 인덱스로 빠르게 접근할 수 있기 때문)
ArrayList는 Async(비동기) → 멀티스레드 아닌 환경
Vector는 Sync(동기) → 멀티스레드 환경에서 Thread-safe하게 사용할 때
Array는 메모리 상으로 연속되어 있고, 여러개의 형태로 다룰 수 있다. index로 빠르게 원하는 값을 찾을 수 있다.
List는 연속되지 않고, 여러개의 데이터를 다룰 수 있다. Array에 비해 index로 빠르게 조회하는 기능은 제한되지만, 크기 조절에 유연하기 때문에 자주 쓰인다.