728x90

빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보단 LinkedList를 사용하는것이 좋다.

그러나 인덱스 검색이나, 맨 마지막에 객체를 추가하는 경우에는 arrayList가 더 좋은 성능을 발휘한다. 

 

ArrayList에 객체를 추가하면 인덱스 0부터 차례대로 저장된다,

또한 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 밀려난다. 

 

ArrayList를 생성하고 런타임 시 필요에 의해 객체들을 추가하는 것이 일반적이지만, 고정된 객체들로 구성된 List를 생성할때도 있다.

이런 경우에는 Arrays.asList(T...a)메소드를 사용하는 것이 간편하다.

 

√ List<T> list = Arrays.asList(T...a)

T타입 파라미터에 맞게 asList() 의 매개값을 순차적으로 입력하거나, T[] 배열을 매개값으로 주면된다. 

 

LinkedList - List 구현 클래스이므로 ArrayList 와 사용 방법은 똑같지만 내부 구조는 완전 다르다.

ArrayList는 내부 배열에 객체를 저장해서 인덱스로 관리하지만, LinkedList는 인접 참조를 링크해서 체인처럼 관리한다.

 

LinkedList에서 특정 인덱스의 객체를 제거하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않는다. 특정 인덱스에 객체를 삽일할때에도 마찬가지이다. ArrayList는 중간 인덱스의 객체를 삭제하면 뒤의 객체는 인덱스가 1씩 앞으로 당겨진다고 위에서도 말한 바 있다. 

 

그렇기 때문에 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 LinkedList가 좋은 성능을 발휘한다.

 

다음 보여질것에서는 중간 객체를 제거할 경우 앞뒤 링크의 수정이 일어나는 모습을 보여진다.

 

기존 데이터 구조

 

 

삭제 했을때 구조

LinkedList를 생성하기 위해서는 저장할 객체 타입을 타입 파라미터(E) 에 표기하고 기본 생성자를 호출하면 된다.

LinkedList가 처음 생성될 때에는 어떠한 링크도 만들어지지 않기 때문에 내부는 비어있다.

List<E> list = new LinkedList<E>();

 

성능에서는 LinkedList가 더 빠릅니다. 

끝에서부터(순차적으로) 추가/삭제하는 경우는 ArrayList가 빠르지만, 중간에 추가 또는 삭제할 경우는 앞뒤 링크 정보만 변경하면 되는 LinkedList가 더 빠르다. ArrayList는 뒤쪽 인덱스들을 모두 1씩 증가 또는 감소시키는 시간이 필요하므로 처리 속도가 느리다.

 

구분 순차적으로 추가/삭제 중간에 추가/삭제 검색
ArrayList 빠르다 느리다 빠르다
LinkedList 느리다 빠르다 느리다

 

결국 사용하고자 하는 방향에 따라 선택이 달라지게 됩니다. 

다음시간에는 ArrayList와 LinkedList를 좀 더 다양한 실습 자료를 가지고 찾아뵙도록 하겠습니다. 

 

혹시 제가 틀린 정보를 공유하였다면 알려주시면 감사하겠습니다.

728x90
복사했습니다!