Array vs ArrayList
Resizable
Array
Array는 static하다(길이 고정). Array 객체를 생성한 후에는 Array의 길이를 마음대로 변경할 수 없다. 따라서, 정해진 길이의 배열을 모두 채우면, 새로운 데이터를 추가하고 싶을 경우 새로운 배열을 만들어주어야 한다.
ArrayList
ArrayList는 사이즈가 dynamic하다. 하지만 내부적으론 배열로 구성되어 있다. ArrayList는 Default로 10개의 공간을 가진 배열로 시작한다. 하지만 최적화(지연 초기화)로 인해 막 생성하면 0개의 사이즈로 시작된다.
각각의 ArrayList Object는 ArrayList의 size를 나타내는 capacity
인스턴스 변수를 가지고 있다. ArrayList에 요소들이 더해지면 ArrayList의 capacity 또한 자동적으로 늘어난다. 만약 설정한 capacity를 넘어서 더 많은 객체가 들어오면, 배열 크기를 1.5배 증가시킨다. 즉 element를 add하려고 할때, capacity가 배열의 길이와 같아지면 일반적으로 기존의 용량 + 기존 용량/2 만큼 크기가 늘어난 배열에 기존의 배열을 copy해준다.
|
|
Performance
ArrayList의 자동 크기 조정은 임시 배열을 사용하여 이전 배열의 요소를 새 배열로 복사하기 때문에 성능이 저하된다. ArrayList의 자동 resize는 성능을 낮출 것이다(old array에서 new array로 요소들을 옮길 때 임시 array를 사용하기 때문에). ArrayList는 resizing하는 동안 내부적으로 Array의 지원을 받는다.(내부적으로 native method인 System.arrayCopy(…)를 사용하기 때문에)
Array나 ArrayList로 부터 요소를 얻거나 추가할 때는 거의 비슷한 성능을 보인다.
Data types
Array
primitive type, Object
ArrayList
ArrayList는 primitive data types(int, float, double etc)을 가질 수 없다. 오직 Object만을 가질 수 있다.
Iterating the values
Array
for loop 아니면 for each loop를 통해 array를 순회할 수 있다.
ArrayList
iterator를 사용해 ArrayList를 순회할 수 있다.
Type-Safety
Array
Array는 동종(homogeneous) data structure이다. 따라서 Array는 특정 데이터 타입의 primitives나 특정 클래스의 objects만을 저장할 수 있다. 만약 명시된 타입이 아닌 다른 데이터 유형을 Array에 저장할 경우 ArrayStoreException이 발생한다.
ArrayList
Generics(제네릭스)를 통해 Type-Safety를 보장한다.
Length
Array
Array의 길이를 반환하는 length 변수
ArrayList
size() 메소드
Adding elements
Array
Assign operator(=)를 사용하여 요소를 추가한다.
ArrayList
add() 메소드를 사용하여 요소를 추가한다.
Multi-dimensional
Array
다차원이 가능하다.
ArrayList
항상 단일 차원이다.
참고
https://velog.io/@humblechoi/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Array-vs-ArrayList