Array와 ArrayList는 요소를 추가하거나 가져올 때의 성능은 비슷하다. 두 작업 모두 일정한 시간에 실행된다.
둘 다 중복되는 요소를 저장할 수 있다.
Null 값을 저장할 수 있고 index를 사용하여 값을 참조할 수 있다.
순서가 지정되지 않음.
Array와 ArrayList은 모든 것이 비슷합니다. 가장 큰 차이점은 길이를 조정할 수 있는가? 없는가? 입니다.
Java의 Array는 고정 길이 입니다. 따라서, 정해진 길이의 배열을 모두 채우면, 새로운 데이터를 추가하고 싶을 경우 새로운 배열을 만들어주어야 합니다.
Java의 ArrayList는 가변 길이입니다. 하지만 내부적으론 배열로 구성되어 있습니다. ArrayList는 Default로 10개의 공간을 가진 배열로 시작합니다. 하지만 최적화(지연 초기화)로 인해 막 생성하면 0개의 사이즈로 시작됩니다. 다만, 편리함의 대가로 살짝 Array보다 느리니 Array로 충분히 처리 가능하다거나 코딩 테스트나 알고리즘을 풀 때에는 Array를 활용해주는 것이 좋을 것 같습니다.
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); //기존 용량 + 기존 용량 /2 (우측 shift 연산)
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
다시 한번 정리하자면, element를 add하려고 할때, capacity가 배열의 길이와 같아지면 일반적으로 기존의 용량 + 기존 용량/2 만큼 크기가 늘어난 배열에 기존의 배열을 copy해준다.
// DEFAULT_CAPACITY=10
// 기본 저장용량 10으로 리스트 생성
List<String> list = new ArrayList<>();
// 저장 용량을 100으로 설정해 ArrayList 생성
List<String> list = new ArrayList<>(100);
Array와 ArrayList의 성능은 수행되는 작업에 따라 달라진다.
resize() operation : ArrayList의 자동 크기 조정은 임시 배열을 사용하여 이전 배열의 요소를 새 배열로 복사하기 때문에 성능이 저하된다.
ArrayList의 자동 resize는 성능을 낮출 것이다(old array에서 new array로 요소들을 옮길 때 임시 array를 사용하기 때문에). ArrayList는 resizing하는 동안 내부적으로 Array의 지원을 받는다.(내부적으로 native method인 System.arrayCopy(...)를 사용하기 때문에)
add() or get() operation : Array나 ArrayList로 부터 요소를 얻거나 추가할 때는 거의 비슷한 성능을 보인다.
ArrayList<int> arrList//x
ArrayList<Integer> arrList//O
ArrayList arraylisttoobject = new ArrayList();
arraylisttoobject.add(23); // try to add 23(primitive)
arraylisttoobject.add(new Integer(23));
// Converted int primitive to Integer object and added to arraylistobject
String temp[] = new String[2]; // creates a string array of size 2
temp[0] = new Integer(12); // throws ArrayStoreException,
int arrayobject[] = new int[3];
int arraylength = arrayobject.length;
int len = arraylist.size(); // uses arraylistobject size method
int addarrayobject[][] = new int[3][2];
array | arrayList | |
---|---|---|
사이즈 | 초기화시 고정 | 초기화시 사이즈를 표시하지 않음. 사이즈가 동적이다. |
속도 | 초기화 시 메모리에 할당되어 속도 빠름 | 추가시 메모리를 재할당하여 속도가 느림 |
변경 | 사이즈 변경 불가 | 추가,삭제 가능 |
다차원 | 가능 | 불가능 |
타입 | primitive type(int,byte, char etc), object | object elemnet만 가능 |
제네릭 | 사용 불가능 | 사용 가능(타입 안정성 보장) |
길이 | length 변수 | size() 메서드 |
변수 추가 | assignment 연산자 사용 | add() 메소드 사용 |
잘보고갑니다 ^^