ArrayList
ArrayList는 List인터페이스를 구현하기 때문에, 저장 순서가 유지되고, 중복을 허용한다.
ArrayList는 기존의 Vector를 개선한 것으로 Vector와 구현원리와 기능적인 측면이 동일하다.
Vector는 레거시 코드들과의 호환성을 유지하기 위해 남겨두는 것이기 때문에, 앞으로는 Vector 말고 ArrayList를 사용하도록 하자.
ArrayList는 내부적으로 Object 배열(Object[])을 사용해서 구현되었다. 배열은 길이가 정적이기 때문에, 더이상 배열에 저장할 공간이 없어진다면 보다 큰 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열로 복사한 후 저장한다.
메소드들은 정말 많지만, 알아서 찾아보도록 하고 이 글에서는 다른것에 대해서 다루도록 하겠다.
추가와 삭제
ArrayList의 요소를 삭제하는 경우, 삭제할 객체의 바로 아래에 있는 데이터를 한 칸씩 위로 복사해서 삭제할 객체를 덮어쓰는 방식으로 처리한다.
만약 삭제할 객체가 마지막 데이터라면 복사할 필요 없이 단순히 null로 변경해주기만 하면 된다.
따라서 배열에 객체를 순차적으로 저장하는 경우와 객체를 마지막에 저장된 것부터 삭제하는 경우 데이터를 옮기지 않아도 되기 때문에 작업시간이 짧지만,
배열의 중간에 위치한 객체를 추가하거나 삭제하는 경우 다른 데이터의 위치를 이동시켜 주어야 하기 때문에 디루는 데이터의 개수가 많을수록 작업시간이 오래 걸린다.
조회 (값 읽기)
배열의 경우에는 만일 인덱스가 n인 원소의 값을 얻어오고 싶다면 다음과 같은 단순한 한 줄의 수식을 통해 얻어올 수 있다.
인덱스가 n인 데이터의 주소 = 배열의 주소 + n * 데이터 타입의 크기
위의 수식으로 위치를 구할 수 있는 이유는 무엇일까?
바로 배열은 각 데이터들이 연속적으로 메모리상에 존재하는 구조이다.
연속적으로 존재하기에, n과 데이터 타입의 크기만 알면 배열 속 원소의 위치를 알 수 있으며, 따라서 값을 조회하는 시간이 매우 빠르다.
📔 Reference
[JAVA의 정석 기초편 - 남궁성]
'☕️ Java > 기본' 카테고리의 다른 글
[JAVA] ArrayList 최대&최솟값 구하기 (0) | 2021.12.17 |
---|---|
[JAVA] LinkedList에 대하여 (ArrayList와의 차이) (0) | 2021.12.17 |
[JAVA] 컬렉션 프레임워크 (Collection, List, Set, Map) (0) | 2021.12.17 |
[JAVA] List 정렬하기 (ArrayList, LinkedList 등) (0) | 2021.12.16 |
[JAVA] Stream의 toList()를 사용하여 ArrayList로 형변환할 때 발생하는 오류 (0) | 2021.12.16 |